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 }

 

 

 

posted @ 2013-03-12 23:59  proverbs  阅读(744)  评论(0编辑  收藏  举报