码迷,mamicode.com
首页 > 其他好文 > 详细

区间DP UVA 1351 String Compression

时间:2015-08-12 21:18:22      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

 

题目传送门

 1 /*
 2     题意:给一个字符串,连续相同的段落可以合并,gogogo->3(go),问最小表示的长度
 3     区间DP:dp[i][j]表示[i,j]的区间最小表示长度,那么dp[i][j] = min (dp[j][k] + dp[k+1][i+j-1]), 
 4             digit (i / k) + dp[j][j+k-1] + 2)后者表示可以压缩成k长度连续相同的字符串
4.5  详细解释
5 */ 6 /************************************************ 7 * Author :Running_Time 8 * Created Time :2015-8-12 15:28:11 9 * File Name :UVA_1351.cpp 10 ************************************************/ 11 12 #include <cstdio> 13 #include <algorithm> 14 #include <iostream> 15 #include <sstream> 16 #include <cstring> 17 #include <cmath> 18 #include <string> 19 #include <vector> 20 #include <queue> 21 #include <deque> 22 #include <stack> 23 #include <list> 24 #include <map> 25 #include <set> 26 #include <bitset> 27 #include <cstdlib> 28 #include <ctime> 29 using namespace std; 30 31 #define lson l, mid, rt << 1 32 #define rson mid + 1, r, rt << 1 | 1 33 typedef long long ll; 34 const int MAXN = 2e2 + 10; 35 const int INF = 0x3f3f3f3f; 36 const int MOD = 1e9 + 7; 37 char str[MAXN]; 38 int dp[MAXN][MAXN]; 39 40 bool check(int l, int r, int k) { 41 int i = 0; 42 while (i < k) { 43 for (int p=1; l+p*k+i<=r; ++p) { 44 if (str[l+i] != str[l+p*k+i]) return false; 45 } 46 ++i; 47 } 48 return true; 49 } 50 51 int digit(int x) { 52 int ret = 0; 53 while (x) { 54 ret++; x /= 10; 55 } 56 return ret; 57 } 58 59 int main(void) { //UVA 1351 String Compression 60 int T; scanf ("%d", &T); 61 while (T--) { 62 scanf ("%s", str + 1); 63 int len = strlen (str + 1); 64 for (int i=1; i<=len; ++i) dp[i][i] = 1; 65 for (int i=2; i<=len; ++i) { 66 for (int j=1; j+i-1<=len; ++j) { 67 dp[j][j+i-1] = INF; 68 int &x = dp[j][j+i-1]; 69 for (int k=j; k<i+j-1; ++k) { 70 x = min (x, dp[j][k] + dp[k+1][i+j-1]); 71 } 72 for (int k=1; k<=i/2; ++k) { 73 if (i % k != 0) continue; 74 if (check (j, i + j - 1, k)) { 75 x = min (x, digit (i / k) + dp[j][j+k-1] + 2); 76 } 77 } 78 } 79 } 80 81 printf ("%d\n", dp[1][len]); 82 } 83 84 return 0; 85 }

 

区间DP UVA 1351 String Compression

标签:

原文地址:http://www.cnblogs.com/Running-Time/p/4725280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!