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

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

时间:2017-04-17 23:37:42      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:lin   class   颜色   std   bzoj   i++   targe   string   ace   

 

【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1260

 

【题目大意】

  假设你有一条长度为n的木版,初始时没有涂过任何颜色
  每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色
  求最少的涂色次数达到目标状态

 

【题解】

  dp[i][j]表示涂抹i到j的最优答案,
  显然当i和j相同时,可以从i+1……j,i……j-1,i+1……j-1转移过来,
  同时也可以从两个区间组合得到。

 

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=100;
int dp[N][N];
char s[N];
int main(){
    while(~scanf("%s",s+1)){
        int n=strlen(s+1);
        memset(dp,0x3f,sizeof(dp));
        for(int i=1;i<=n;i++)dp[i][i]=1;
        for(int k=1;k<n;k++){
            for(int i=1;i<=n-k;i++){
                if(s[i]==s[i+k]){
                    dp[i][i+k]=min(dp[i][i+k-1],dp[i+1][i+k]);
                    dp[i][i+k]=min(dp[i][i+k],dp[i+1][i+k-1]+1);
                }else{
                    for(int j=i;j<i+k;j++){
                        dp[i][i+k]=min(dp[i][i+k],dp[i][j]+dp[j+1][i+k]);
                    }
                } 
            }
        }printf("%d\n",dp[1][n]);
    }return 0;
}

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

标签:lin   class   颜色   std   bzoj   i++   targe   string   ace   

原文地址:http://www.cnblogs.com/forever97/p/bzoj1260.html

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