状态:
d
p
[
l
]
[
r
]
[
k
]
→
dp[l][r][k]\to
dp[l][r][k]→区间[l, r]是否能被压缩成k
目标:
d
p
m
i
n
[
1
]
[
n
]
[
i
∈
[
1
,
4
]
]
dpmin[1][n][i\in [1, 4]]
dpmin[1][n][i∈[1,4]]
边界:
d
p
[
i
]
[
i
]
[
t
o
i
n
t
(
a
[
i
−
1
]
)
]
=
1
dp[i][i][toint(a[i-1])]=1
dp[i][i][toint(a[i−1])]=1区间[i,i]能由字符i压缩来
合法判断: 条件转移, 满足左右区间能同时转移才行
转移方程: 见下
attention: 注意边界
双倍经验:
数据的存储
状态的设计
#include<bits/stdc++.h>#include<bits/extc++.h>#define _rep(i, a, b) for (ll i = (a); i <= (b); ++i)#define _rev(i, a, b) for (ll i = (a); i >= (b); --i)#define _for(i, a, b) for (ll i = (a); i < (b); ++i)#define _rof(i, a, b) for (ll i = (a); i > (b); --i)#define ll long long#define db double#define oo 0x3f3f3f3f#define eps 0.00001#define all(x) x.begin(), x.end()#define met(a, b) memset(a, b, sizeof(a))#define id(x) ((x + 8))#define bin(x) cerr << #x << " is " << bitset<15>(x) << endl#define what_is(x) cerr << #x << " is " << x << endl#define lowbit(x) x &(-x)usingnamespace std;constint maxn =210;int num[5], change[66][3], cnt, n;
string a;bool dp[maxn][maxn][5];inlineintto_int(char o){if(o =='W')return1;if(o =='I')return2;if(o =='N')return3;if(o =='G')return4;}intmain(){
ios::sync_with_stdio(0);_rep(i,1,4){
cin >> num[i];}_rep(i,1,4){_rep(j,1, num[i]){
string aa;
cin >> aa;
change[++cnt][0]= i;
change[cnt][1]=to_int(aa[0]);
change[cnt][2]=to_int(aa[1]);}}
cin >> a;
n = a.size();_rep(i,1, n)dp[i][i][to_int(a[i-1])]=1;_rep(len,2, n){_rep(l,1, n - len +1){int r = l + len -1;_rep(k, l, r){_rep(i,1, cnt){if(dp[l][k][change[i][1]]&& dp[k+1][r][change[i][2]]){
dp[l][r][change[i][0]]=1;}}}}}bool out =0;_rep(i,1,4){if(dp[1][n][i]){
out =1;if(i ==1)putchar('W');if(i ==2)putchar('I');if(i ==3)putchar('N');if(i ==4)putchar('G');}}if(! out){
cout <<"The name is wrong!"<< endl;}}