2020-2021:teams:farmer_john:jjleo:educational_codeforces_round_82_rated_for_div._2_virtual_participation
A
B
C
D
E
题解:状态设计tql,太菜了想不到啊。首先肯定要枚举$t$的分割点,将$t$分为两个字符串,然后如果设$f[i][j]$为是否能匹配前一个字符串到第$i$位且匹配后一个字符串到第$j$位,转移是$O(n)$的,那么总复杂度是$O(n^4)$的会TLE。因此要换一个状态设计,同样还是要枚举分割点,设$f[i][j]$表示考虑到$s$的第$i$位在第一个字符串匹配了$j$个字符的情况下第二个字符串最多能匹配多少个字符。转移的话有三种,直接贴代码,很直观。
bool suc = false;
for(int i = 1;i < m;i++){
memset(f, -0x3f, sizeof(f)), f[0][0] = 0;
for(int j = 0;j < n;j++){
for(int k = 0;k <= i;k++){
if(f[j][k] < 0) continue;
if(t[k + 1] == s[j + 1]) f[j + 1][k + 1] = max(f[j + 1][k + 1], f[j][k]);//和第一个字符串匹配
f[j + 1][k] = max(f[j + 1][k], f[j][k]);//都不匹配
if(t[i + f[j][k] + 1] == s[j + 1]) f[j + 1][k] = max(f[j + 1][k], f[j][k] + 1);//和第二个字符串匹配
}
}
if(f[n][i] == m - i){
suc = true, puts("YES");
break;
}
}
if(!suc) puts("NO");
F
G
2020-2021/teams/farmer_john/jjleo/educational_codeforces_round_82_rated_for_div._2_virtual_participation.txt · 最后更改: 2020/06/25 23:04 由 jjleo