[luoguP1136] 迎接仪式(DP)
2017-08-06 17:57
274 查看
每个字母只有两种选择,变成另一个或者不变。
所以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 ; int f [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; }
相关文章推荐
- [jzoj]1330. 迎接仪式(转化模型+DP)
- 洛谷P1136 迎接仪式 DP
- jzoj P1330 迎接仪式___dp
- 洛谷1136 迎接仪式
- dp——洛谷P1136 迎接仪式
- [luoguP3252] [JLOI2012]树(DP)
- [luoguP1879] [USACO06NOV]玉米田Corn Fields(DP)
- [luoguP3146] [USACO16OPEN]248(区间DP)
- 纪念一下一道题,luoguP1417 DP
- CDOJ 1136(数位DP)
- 【noip模拟题】迎接仪式(dp+特殊的技巧)
- LuoguP2657 [SCOI2009]windy数 【数位dp】By cellur925
- [luoguP1773] 符文之语_NOI导刊2010提高(02)(DP)
- [luoguP1103] 书本整理(DP)
- 【动态规划】Vijos P1616 迎接仪式
- [luoguP3205] [HNOI2010]CHORUS 合唱队(区间DP)
- [luoguP1922] 女仆咖啡厅桌游吧(奇奇怪怪的树形DP)
- [luoguP1021] 邮票面值设计(DFS + dp)
- [luoguP2157] [SDOI2009]学校食堂Dining(状压DP)
- LuoguP2602 [ZJOI2010]数字计数【数位dp】By cellur925