cf1800-2200的dp
Posted pandaking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf1800-2200的dp相关的知识,希望对你有一定的参考价值。
codeforces1132f
题意:应该是懂得,然后题解在代码里面,比较意识流,看看就好了
1 /* 2 这种题给n=500就一种很浓浓的区间dp风格啊。。。。。。。。。。。。 3 首先我们 设 dp[l][r]为把l和r这个段的全部点都消去所用的最小操作 4 给一个样例 babaca 5 首先如果我们可以知道ai[l]==ai[r]的话我们可以通过合并的时候减少一次操作 6 然后这居然就可以了。。。。。。。。。。。????????? 7 倒是真的无法反驳啊 8 首先肯定是要枚举断点的,枚举断点和-1 9 10 那就有一个问题,枚举断点后我们会存在一个情况,假如断点两端相等怎么办,你枚举到下一层 11 不就可以了吗? 12 13 */ 14 #include <algorithm> 15 #include <iostream> 16 #include <cstdio> 17 #include <cstring> 18 #include <cmath> 19 #include <bitset> 20 typedef long long ll; 21 using namespace std; 22 char sz[510]; 23 int dp[510][510]; 24 int len; 25 int main(){ 26 scanf("%d",&len); 27 scanf("%s",sz+1); 28 for(int i=1;i<=len;i++) dp[i][i]=1;//这个要记得 29 for(int i=len;i>=1;i--){ 30 for(int j=i+1;j<=len;j++){ 31 dp[i][j]=(j-i+1);//这个初始化是最好的 32 //我们以段长初始化就保证不会犯错误 33 for(int k=i+1;k<=j;k++){ 34 if(sz[i]==sz[j]) dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k][j]-1); 35 else dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k][j]); 36 } 37 } 38 } 39 cout<<dp[1][len]<<endl; 40 return 0; 41 }
以上是关于cf1800-2200的dp的主要内容,如果未能解决你的问题,请参考以下文章