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 }
View Code

 

以上是关于cf1800-2200的dp的主要内容,如果未能解决你的问题,请参考以下文章

cf 710E dp

CF#358 D. Alyona and Strings DP

CF16E Fish(状压+期望dp)

CF 1042B. Vitamins(状压dp)

「CF1286A」Garland

CF540D Bad Luck Island(期望dp)