首页 > 代码库 > [luoguP1136] 迎接仪式(DP)
[luoguP1136] 迎接仪式(DP)
传送门
每个字母只有两种选择,变成另一个或者不变。
所以f[i][j][k]表示前i个字母有j个j变成z,有k个z变成j
只需要比较j==k时的答案就行
#include <cstdio>#include <cstring>#define N 505#define max(x, y) ((x) > (y) ? (x) : (y))int n, m, ans;char s[N];int f[N][105][105];int main(){ int i, j, k; scanf("%d %d", &n, &m); scanf("%s", s + 1); memset(f, -0x3f, sizeof(f)); f[0][0][0] = f[1][0][0] = 0; s[1] == ‘j‘ ? f[1][1][0] = 0 : f[1][0][1] = 0; for(i = 2; i <= n; i++) for(j = 0; j <= m; j++) for(k = 0; k <= m; k++) { f[i][j][k] = f[i - 1][j][k]; if(s[i - 1] == ‘j‘ && s[i] == ‘z‘) f[i][j][k] = max(f[i][j][k], f[i - 2][j][k] + 1); if(s[i - 1] == ‘j‘ && s[i] == ‘j‘ && j) f[i][j][k] = max(f[i][j][k], f[i - 2][j - 1][k] + 1); if(s[i - 1] == ‘z‘ && s[i] == ‘z‘ && k) f[i][j][k] = max(f[i][j][k], f[i - 2][j][k - 1] + 1); if(s[i - 1] == ‘z‘ && s[i] == ‘j‘ && j && k) f[i][j][k] = max(f[i][j][k], f[i - 2][j - 1][k - 1] + 1); if(j == k) ans = max(ans, f[i][j][k]); } printf("%d\n", ans); return 0;}
[luoguP1136] 迎接仪式(DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。