1. 程式人生 > 實用技巧 >A Color Game

A Color Game

題目連結:https://codeforces.ml/gym/102835/submit

題意:給定7種字元 每有一段連續的長度大於m的相同字元就能消去 問最終整段字串能否消去

dp[i][j][x] 代表 i到j區間 剩種類為x的數最大為多少

那麼每次區間合併的時候 還是 dp[i][j][x]=max(dp[i][k][x]+dp[k+1][j][x],dp[i][j][x]) 如果當前的區間段有能夠刪除的段

那麼 其他的字串的當前區間段的數的非法狀態就可以置為0 保證能把斷開的字串接起來

注意 長度為1的要特判 開始全部置為-1 為非法狀態 最後只有某一個字串能在[1,n]整段消去的時候才能保證yes

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pb push_back
 4 using namespace std;
 5 const int maxn=5e2+10;
 6 const int mod=1e9+7;
 7 int dp[maxn][maxn][10];
 8 char s[maxn];
 9 map<char,int>mp;
10  
11  
12 int main()
13 {
14     ios::sync_with_stdio(0);
15     cin.tie(0);
16 cin>>(s+1); 17 int n=strlen(s+1); 18 mp['R']=1;mp['G']=2;mp['B']=3; 19 mp['C']=4;mp['M']=5;mp['Y']=6; 20 mp['K']=7; 21 int m; 22 cin>>m; 23 if(m==1) 24 { 25 cout<<"Yes"<<'\n'; 26 return 0; 27 } 28 for(int i=0;i<maxn;i++)
29 for(int j=0;j<maxn;j++) 30 for(int x=0;x<8;x++) 31 dp[i][j][x]=-1e9; 32 for(int i=1;i<=n;i++) 33 { 34 dp[i][i][mp[s[i]]]=1; 35 } 36 for(int len=2;len<=n;len++) 37 { 38 for(int i=1;i+len-1<=n;i++) 39 { 40 int j=i+len-1; 41 int f=0; 42 for(int k=i;k<j;k++) 43 { 44 for(int x=1;x<=7;x++) 45 { 46 dp[i][j][x]=max(dp[i][j][x],dp[i][k][x]+dp[k+1][j][x]); 47 if(dp[i][j][x]>=m) 48 f=1; 49 } 50 } 51 for(int x=1;x<=7;x++) 52 { 53 if(dp[i][j][x]<0) 54 { 55 if(f) 56 dp[i][j][x]=0; 57 } 58 } 59 } 60 } 61 62 for(int i=1;i<=7;i++) 63 { 64 if(dp[1][n][i]>=m) 65 { 66 cout<<"Yes"<<'\n'; 67 return 0; 68 } 69 } 70 cout<<"No"<<'\n'; 71 72 }
View Code