题目大意: 给定一个只包含七种字母的字符串,如果满足一段连续相同的字符长度大于等于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 }