动态规划复习(持续更新)
Posted shixinyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划复习(持续更新)相关的知识,希望对你有一定的参考价值。
最近除了模拟赛和往年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; }
以上是关于动态规划复习(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章