CQOI2007 涂色 paint (区间dp)

听说这道题是当年省选题

于是兴致勃勃拿来做了做

至于如何想到思路...

事实上没想象中那么简单...

脑阔挺疼的...

(一开始都没看出来是区间dp)

想到可以区间dp,然后就似乎没啥大问题

枚举区间dp[i][j]的时候,如果i j一样那就好说,相当于当初某一次涂的时候多往外涂一格就好

如果i j不一样?我反而在这里懵了

但我误打误撞就给正解写出来了

想不到正解居然这么简单???

认真思考之后大体明白了

因为不能像i==j那样直接多涂一个

所以就可以直接区间枚举了...

总有一个是最优的

 

 1 #include<cstdio>
 2 int min(int a,int b){return a<b?a:b;}
 3 char colin[52];
 4 int col[52],dp[52][52];
 5 int main()
 6 {
 7     scanf("%s",colin);
 8     int n=strlen(colin);
 9     for(int i=0;i<n;i++)
10     {
11         col[i+1]=colin[i];
12     }
13     memset(dp,0x3f,sizeof(dp));
14     for(int i=0;i<=n+1;i++)dp[i][i]=1;
15     for(int d=1;d<n;d++)
16     {
17         for(int i=1;i+d<=n;i++)
18         {
19             if(col[i]==col[i+d])dp[i][i+d]=min(dp[i][i+d-1],dp[i+1][i+d]);
20             else for(int k=i;k<i+d;k++)
21             {
22                 dp[i][i+d]=min(dp[i][i+d],dp[i][k]+dp[k+1][i+d]);
23             }
24         }
25     }
26     printf("%d",dp[1][n]);
27     return 0;
28 }

以上,有点后悔出生太晚了

2018NOIP简直毒瘤啊
(NOIP=POI*N)

再看看当年省选...

 

做完这道题之后你可以再去看看

[hdu2476]String painter(区间dp)

没错他们完全一样

转载于:https://www.cnblogs.com/rikurika/p/paint.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值