标签:const turn AC false 动态规划 转移 表示 scan break
//It is coded by Ning_Mew on 5.10
#include<bits/stdc++.h>
using namespace std;
const int maxn=207;
int n[5],ll=0;
int s[10][20][5];
int goal[maxn];
string ss;
int dp[maxn][maxn][10];
int num[30];
int main(){
scanf("%d%d%d%d",&n[1],&n[2],&n[3],&n[4]);
num[‘W‘-‘A‘+1]=1;num[‘I‘-‘A‘+1]=2;
num[‘N‘-‘A‘+1]=3;num[‘G‘-‘A‘+1]=4;
for(int i=1;i<=4;i++){
for(int j=1;j<=n[i];j++){
cin>>ss;
s[i][j][1]=num[ss[0]-‘A‘+1];
s[i][j][2]=num[ss[1]-‘A‘+1];
}
}
cin>>ss;ll=ss.length();
for(int i=0;i<ll;i++){
dp[i][i][ num[ss[i]-‘A‘+1] ]=1;
goal[i]=num[ss[i]-‘A‘+1];
}
for(int len=2;len<=ll;len++){
for(int i=0;i<=ll-len;i++){
int ss=i,tt=i+len-1;
for(int j=ss;j<=tt-1;j++){//中间的断点
for(int sta=1;sta<=4;sta++){
for(int k=1;k<=n[sta];k++){
int ll=s[sta][k][1],rr=s[sta][k][2];
if(dp[ss][j][ll]==1 && dp[j+1][tt][rr]==1){dp[ss][tt][sta]=1;break;}
}
}
}
}
}
bool out=false;
for(int i=1;i<=4;i++){
if(dp[0][ll-1][i]){
if(i==1)printf("W"),out=true;if(i==2)printf("I"),out=true;
if(i==3)printf("N"),out=true;if(i==4)printf("G"),out=true;
}
}
if(!out)printf("The name is wrong!");printf("\n");
return 0;
}
【题解】 bzoj1055: [HAOI2008]玩具取名 (动态规划)
标签:const turn AC false 动态规划 转移 表示 scan break
原文地址:https://www.cnblogs.com/Ning-Mew/p/9021898.html