[BZOJ1068][SCOI2007]压缩(区间DP)
来源:互联网 发布:学单片机看什么书 编辑:程序博客网 时间:2024/05/17 01:02
由于每次压缩的都是连续的一段,所以可以想到分段DP,又由于压缩可以嵌套,所以考虑区间DP。为了方便,先假设压缩后的字符串前面自带一个M,统计答案时减
先想到最经典的模型:
第
第
这时候转移就是
但上面的转移是错的。原因就在于第
所以这里就可以规定一个新的方案:
边界为
第
第
第
最后答案就是
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 55, INF = 0x3f3f3f3f;int n, f[N][N][2]; char s[N];int dfs(int l, int r, int op) { if (f[l][r][op] != -1) return f[l][r][op]; if (l == r) return f[l][r][op] = 2; int i, res = INF; if (op) { res = r - l + 2; int mid; bool flag = 1; if (!(r - l & 1)) flag = 0; mid = l + r >> 1; for (i = l; i <= mid; i++) if (s[i] != s[mid + i - l + 1]) flag = 0; if (flag) res = min(res, dfs(l, mid, 1) + 1); for (i = l; i < r; i++) res = min(res, dfs(l, i, 1) + r - i); } else for (i = l; i < r; i++) { res = min(res, dfs(l, i, 0) + dfs(i + 1, r, 0)); if (i + 1 < r) res = min(res, dfs(l, i, 0) + dfs(i + 1, r, 1)); if (l < i) res = min(res, dfs(l, i, 1) + dfs(i + 1, r, 0)); if (l < i && i + 1 < r) res = min(res, dfs(l, i, 1) + dfs(i + 1, r, 1)); } return f[l][r][op] = res;}int main() { memset(f, -1, sizeof(f)); scanf("%s", s + 1); n = strlen(s + 1); dfs(1, n, 0); dfs(1, n, 1); cout << min(f[1][n][0], f[1][n][1]) - 1 << endl; return 0;}
- [BZOJ1068][SCOI2007]压缩(区间DP)
- bzoj1068 [SCOI2007]压缩(区间DP)
- 【BZOJ1068】[SCOI2007]压缩【区间DP】
- 【bzoj1068】[SCOI2007]压缩 区间dp
- [bzoj1068][SCOI2007]压缩 区间dp
- bzoj1068(区间dp,字符串压缩)
- bzoj1068: [SCOI2007]压缩
- bzoj1068[SCOI2007]压缩
- 【bzoj1068】[SCOI2007]压缩
- 【bzoj1068】[SCOI2007]压缩
- [SCOI2007]压缩 区间dp
- BZOJ 1068 [SCOI2007]压缩 区间DP
- BZOJ 1068: [SCOI2007]压缩 区间DP
- 【bzoj 1068】[SCOI2007]压缩 区间dp
- bzoj1068压缩
- [SCOI2007]压缩 (洛谷2470)
- BZOJ 1068 压缩 (区间dp)
- BZOJ1068
- [BZOJ4819][SDOI2017]新生舞会(二分答案+费用流)
- 全硬件TCP/IP协议栈学习笔记 W5500+FPGA实现tcp连接
- C++多线程
- String生成缩略词的工具类
- Java核心技术 卷1 (第十版)学习笔记
- [BZOJ1068][SCOI2007]压缩(区间DP)
- C#操作XML方法集合
- Lintcode 5. 第k大元素
- node项目部署linux
- Python之路【第2天】
- struts解决异常抛出的两种方法
- [BZOJ3110][ZJOI2013]K大数查询(线段树套线段树)
- 机房重构总结3
- Python系列学习笔记(一)——入门学习