码迷,mamicode.com
首页 > 其他好文 > 详细

cf1800-2200的dp

时间:2019-04-08 21:43:14      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:lse   show   name   isp   i++   event   cstring   错误   none   

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

标签:lse   show   name   isp   i++   event   cstring   错误   none   

原文地址:https://www.cnblogs.com/pandaking/p/10673344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!