首页 > 其他 > 详细

动态规划复习(持续更新)

时间:2017-10-30 17:55:17      阅读:200      评论:0      收藏:0      [点我收藏+]

最近除了模拟赛和往年noip题自我测试,就只能搞点弱项专题训练了。

都是洛谷上的题,每次从水题开始:

 

便宜的回文

区间dp,对于一个字母,增删其实效果是相同的,取代价最小的即可。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=3000+10;
int n,m,val[maxn],dp[maxn][maxn];
char c,s[maxn];

int aa;char cc;
int read() {
    aa=0;cc=getchar();
    while(cc<‘0‘||cc>‘9‘) cc=getchar();
    while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
    return aa;
}

int main() {
    m=read();n=read(); int x,y;
    scanf("%s",s+1);
    for(int i=1;i<=m;++i) {
        do c=getchar();while(c<‘a‘||c>‘z‘);
        x=c-‘a‘+1; y=min(read(),read());
        val[x]=y;
    }
    memset(dp,0x3f3f3f3f,sizeof(dp));
    for(int i=1;i<=n;++i) dp[i][i]=0;
    for(int i=1;i<n;++i) if(s[i]==s[i+1]) dp[i][i+1]=0;
    for(int l=1;l<n;++l) {
        for(int i=1;i<=n-l;++i) {
            int j=i+l;
            if(s[i]==s[j]&&l>1) dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
            dp[i][j]=min(dp[i][j],dp[i+1][j]+val[s[i]-‘a‘+1]);
            dp[i][j]=min(dp[i][j],dp[i][j-1]+val[s[j]-‘a‘+1]);
        }
    }
    printf("%d",dp[1][n]);
    return 0;
}

  

 

动态规划复习(持续更新)

原文:http://www.cnblogs.com/Serene-shixinyi/p/7755456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!