BZOJ 1090: [SCOI2003]字符串折叠 区间动归
来源:互联网 发布:网络即时通讯工具问卷 编辑:程序博客网 时间:2024/05/23 19:15
Description
折叠的定义如下: 1. 一个字符串可以看成它自身的折叠。记作S S 2. X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S) SSSS…S(X个S)。 3. 如果A A’, BB’,则AB A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) AAACBB,而2(3(A)C)2(B)AAACAAACBB 给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。
Input
仅一行,即字符串S,长度保证不超过100。
Output
仅一行,即最短的折叠长度。
Sample Input
NEERCYESYESYESNEERCYESYESYES
Sample Output
14
HINT
一个最短的折叠为:2(NEERC3(YES))
解题方法:福利题。。dp[l][r]表示l~r的最短折叠长度即可推出:dp[l][r]=min(r-l+1,dp[l][k]+dp[k+1][r])l<=k < r。当k+1~r可以由l~k重复得到时还要:dp[l][r]=min(dp[l][r],dp[l][k]+2+calc((r-l+1)/(k-l+1)));//calc用来计算一个十进制数所占位数,最后的答案为dp[1][n]。A了这道题之后我在思考一个问题,如果要求输出这个压缩后的串该怎么办呢?我没想到怎么做,如果有路过的并知道的大牛请指点一下蒟蒻。。
代码如下:
#include <bits/stdc++.h>using namespace std;const int maxn = 210;int dp[maxn][maxn];char s[maxn];bool check(int l, int r, int k){ int len = r - l + 1; for(int i = k; i + k <= len; i += k){ for(int j = l; j <= (l+k-1); j++){ if(s[j] != s[i+j]) return 0; } } return 1;}int cal(int x, int y){ if(y/x < 10) return 1; if(y/x < 100) return 2; return 3;}int dfs(int l, int r){ if(l == r) return 1; if(dp[l][r]) return dp[l][r]; int &res = dp[l][r]; int len = r - l + 1; res = len + 2; for(int i = l; i < r; i++){ res = min(res, dfs(l, i) + dfs(i + 1, r)); } for(int i = 1; i < len; i++){ if(len % i == 0){ if(check(l, r, i)){ res = min(res, dfs(l, l+i-1) + 2 + cal(i,len)); } } } return res;}int main(){ scanf("%s", s+1); int len = strlen(s+1); cout << dfs(1, len) << endl; return 0;}
0 0
- BZOJ 1090: [SCOI2003]字符串折叠 区间动归
- BZOJ 1090 [SCOI2003]字符串折叠 区间DP
- 【bzoj 1090】[SCOI2003]字符串折叠 区间dp
- [BZOJ]1090: [SCOI2003]字符串折叠 区间DP
- BZOJ 1090: [SCOI2003]字符串折叠
- 【BZOJ 1090】 [SCOI2003]字符串折叠
- bzoj 1090 [SCOI2003]字符串折叠
- 【BZOJ 1090】[SCOI2003]字符串折叠
- 1090: [SCOI2003]字符串折叠 (区间动态规划)
- 1090: [SCOI2003]字符串折叠 区间DP
- BZOJ系列1090《[SCOI2003]字符串折叠》题解
- BZOJ 1090: [SCOI2003]字符串折叠|动态规划
- 1090: [SCOI2003]字符串折叠
- BZOJ 1090 SCOI2003 字符串折叠 动态规划+Hash
- 【BZOJ1090】[SCOI2003]字符串折叠【区间DP】
- BZOJ1090: [SCOI2003]字符串折叠 区间DP
- 【BZOJ1090】【SCOI2003】字符串折叠 {区间dp}
- BZOJ1090(SCOI2003)[字符串折叠]--区间DP
- Ubuntu环境下使用OpenOCD调试目标平台
- 蓝桥杯——2011 HIT计算机研究生机试真题(2017.1.31)
- mysql基础
- 每天读一点好玩心理学--电梯
- 18.进程同步与死锁——信号量的代码实现
- BZOJ 1090: [SCOI2003]字符串折叠 区间动归
- nodejs开发——http模块
- 关联规则挖掘-频繁模式挖掘
- 每天读一点好玩心理学--酒吧
- arrayList hashset的比较及hashcode分析
- ext可视化工具Sencha Architect 3破解
- Linux C 字符串操作
- 莫队算法及其应用
- 插入排序