A Color Game

题目大意:  给定一个只包含七种字母的字符串,如果满足一段连续相同的字符长度大于等于K那么即可消除,问最后能不能变为空字符。

题解:很明显是用区间dp来解决,我们设dp[l][r][k]代表的是在[l,r]区间里消去其他字符后K字符的个数。如果不存在那么赋值-INF。具体细节见代码。

AC_code:

 1 int id[100];
 2 int dp[550][550][8],m;//表示 l r 区间消去其他颜色的球还剩下k颜色球的数量
 3 string t="ARGBCMYK";
 4 char s[550];
 5 void run(){
 6     cin>>(s+1)>>m;
 7     int n=strlen(s+1);
 8     if(m==1) {  //特殊情况单独考虑
 9         puts("Yes") ;
10         return ;
11     }
12     rep(i,1,t.size()-1) id[t[i]]=i;
13     mem(dp,-inf);
14     rep(i,1,n) dp[i][i][id[s[i]]]=1;
15     rep(len,2,n) rep(l,1,n+1-len){
16         int r=l+len-1;bool flag=0;
17         rep(i,l,r-1){
18             rep(k,1,7){
19                 dp[l][r][k]=max(dp[l][r][k],dp[l][i][k]+dp[i+1][r][k]);
20                 if(dp[l][r][k]>=m) flag=1;
21             }
22         }
23         rep(k,1,7) if(dp[l][r][k]<0&&flag) dp[l][r][k]=0;
24     }
25     rep(i,1,7) if(dp[1][n][i]>=m) {
26         puts("Yes");
27         return;
28     }
29     puts("No");
30 }
原文地址:https://www.cnblogs.com/zpj61/p/14532446.html