BZOJ 1055 [HAOI2008]玩具取名 DP
dp[i][j][k]表示从i到j合并,能否合并成字母k。。
怎么暴力怎么来转移~
View Code
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 #include <vector> 7 8 #define N 222 9 10 using namespace std; 11 12 const char t[5]={' ','W','I','N','G'}; 13 int hs[N],num[5],dp[N][N][5],ans; 14 char str[N]; 15 vector<int> a[5][5]; 16 17 inline void read() 18 { 19 hs['W']=1; hs['I']=2; hs['N']=3; hs['G']=4; 20 for(int i=1;i<=4;i++) scanf("%d",&num[i]); 21 for(int i=1;i<=4;i++) 22 for(int j=1;j<=num[i];j++) 23 { 24 scanf("%s",str+1); 25 a[hs[str[1]]][hs[str[2]]].push_back(hs[t[i]]); 26 } 27 scanf("%s",str+1); 28 } 29 30 inline void go() 31 { 32 int n=strlen(str+1); 33 for(int i=1;i<=n;i++) dp[i][i][hs[str[i]]]=true; 34 for(int j=2;j<=n;j++) 35 for(int i=1;i+j-1<=n;i++) 36 for(int k=i;k<i+j-1;k++) 37 for(int p=1;p<=4;p++) 38 if(dp[i][k][p]) 39 for(int q=1;q<=4;q++) 40 if(dp[k+1][i+j-1][q]) 41 for(int s=0;s<a[p][q].size();s++) 42 dp[i][i+j-1][a[p][q][s]]=true; 43 for(int i=1;i<=4;i++) 44 if(dp[1][n][i]) ans++,printf("%c",t[i]); 45 if(ans==0) printf("The name is wrong!"); 46 } 47 48 int main() 49 { 50 read(),go(); 51 return 0; 52 }
没有人能阻止我前进的步伐,除了我自己!