UVALive - 3363 String Compression (区间DP)
2014-01-29 14:32
369 查看
题意:将一串字符串按照规定压缩后的最小的长度是多少
思路:在区间DP上,再注意一点就行了,就是可以考虑当自身能作为压缩的字符串的情况
思路:在区间DP上,再注意一点就行了,就是可以考虑当自身能作为压缩的字符串的情况
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 210; const int INF = 0x3f3f3f3f; char str[MAXN]; int dp[MAXN][MAXN],n; int check(int s,int t,int k){ if ((t-s+1) % k != 0) return 0; for (int i = s+k; i <= t; i += k) for (int j = 0; j < k; j++) if (str[s+j] != str[i+j]) return 0; return (t-s+1) / k; } int getnum(int x){ if (x >= 0 && x <= 9) return 1; if (x >= 10 && x <= 99) return 2; return 3; } void solve(){ for (int i = 0; i < n; i++) dp[i][i] = 1; int temp; for (int k = 2; k <= n; k++){ for (int i = 0; i <= n-k; i++){ dp[i][i+k-1] = INF; for (int j = i; j < i+k-1; j++) dp[i][i+k-1] = min(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]); for (int z = 1; z <= k/2; z++){ int temp = check(i,i+k-1,z); if (temp) dp[i][i+k-1] = min(dp[i][i+k-1],dp[i][i+z-1]+2+getnum(temp)); } } } } int main(){ int t; scanf("%d",&t); while (t--){ scanf("%s",str); n = strlen(str); solve(); printf("%d\n",dp[0][n-1]); } return 0; }
相关文章推荐
- UVALive - 3363 String Compression 区间DP
- uvalive 3363(区间dp)
- UVALive 6529 Eleven 区间dp
- UVALive 3363 String Compression (区间DP,4级)
- UVALive 4857 Halloween Costumes(区间DP)
- UVALive 3363 String Compression (区间DP,4级)
- UVALive 6529 Eleven 区间dp
- Wooden Signs uvalive gym 区间dp
- uvalive 6938 区间dp
- UVALive 5695 -The Last Puzzle -区间dp
- uva live 3516 Exploring Pyramids 区间DP
- uva live 4394 String painter 区间dp
- HDU 2476 | UVALive 4394 - String painter (区间DP)
- UVALIVE4394,区间DP好题
- UVALive 4987---Evacuation Plan(区间DP)
- uva live 4394 String painter 区间dp
- uvalive4394(区间dp)
- 【区间dp】【记忆化搜索】UVALive - 3516 - Exploring Pyramids
- UVAlive 7061 Dire Wolf (区间DP)
- UVALIVE 4857 Halloween Costumes (区间DP)