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 }

 

 

 

你可能感兴趣的:(2008)