UVA 1351 - String Compression
题意: 对于一个字符串中的重复部分可以进行缩写,例如”gogogo“可以写成“3(go)”,从6个字符变成5个字符。。"nowletsgogogoletsgogogoandrunrunruncould " 可以写成 "now2(lets3(go))and3(run)".现在问在这个规则下,问给定一个串的最短长度是多少?
思路:记忆化搜索 + 区间dp,设dp[n][m]表示字符串的第n到第m个字符的最短长度,那么状态转移方程就是:
dp[n][m] = min(dp[n][n + k]+dp[n+k+1][m],calNum(k)
+ 2 + dp[n][n + k - 1]);
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 222;
const int INF = 0x7fffffff;
char str[MAXN];
int dp[MAXN][MAXN];
int calNum(int n){
int cnt = 0;
while(n) cnt ++, n /= 10;
return cnt;
}
bool check(int n, int m, int k){
if((m - n + 1) % k) return false;
for(int i = 0 ;i < k;i ++){
for(int j = n + k ;j <= m; j += k){
if(str[j+i] != str[n+i]) return false;
}
}
return true;
}
int dfs(int n, int m){ //dp[n][m] = min(dp[n][k] + dp[k+1][m], calNum(k) + dp[n][n+k-1] + 2);
if(n == m) return 1;
if(dp[n][m]) return dp[n][m];
dp[n][m] = INF;
for(int i = 0; i <= m - n - 1; i ++){
dp[n][m] = min(dp[n][m], dfs(n, n + i) + dfs(n + i + 1, m));
if(check(n, m, i + 1)) dp[n][m] = min(dp[n][m], calNum((m - n + 1)/(i + 1)) + 2 + dfs(n, n + i));
}
return dp[n][m];
}
int main(){
int n;
freopen("in.cpp", "r", stdin);
while(~scanf("%d", &n)){
for(int i = 0;i < n;i ++){
memset(dp, 0, sizeof(dp));
scanf("%s", str);
printf("%d\n", dfs(0, strlen(str)-1));
}
}
return 0;
}
UVA 1351 - String Compression的更多相关文章
- 区间DP UVA 1351 String Compression
题目传送门 /* 题意:给一个字符串,连续相同的段落可以合并,gogogo->3(go),问最小表示的长度 区间DP:dp[i][j]表示[i,j]的区间最小表示长度,那么dp[i][j] = ...
- UVA 1351 十三 String Compression
String Compression Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- 【leetcode】443. String Compression
problem 443. String Compression Input ["a","a","b","b"," ...
- 443. String Compression
原题: 443. String Compression 解题: 看到题目就想到用map计数,然后将计数的位数计算处理,这里的解法并不满足题目的额外O(1)的要求,并且只是返回了结果array的长度,并 ...
- CF825F String Compression 解题报告
CF825F String Compression 题意 给定一个串s,其中重复出现的子串可以压缩成 "数字+重复的子串" 的形式,数字算长度. 只重复一次的串也要压. 求压缩后的 ...
- 213. String Compression【LintCode java】
Description Implement a method to perform basic string compression using the counts of repeated char ...
- 213. String Compression【easy】
Implement a method to perform basic string compression using the counts of repeated characters. For ...
- codeforces 825F F. String Compression dp+kmp找字符串的最小循环节
/** 题目:F. String Compression 链接:http://codeforces.com/problemset/problem/825/F 题意:压缩字符串后求最小长度. 思路: d ...
- Codeforces 825F - String Compression
825F - String Compression 题意 给出一个字符串,你要把它尽量压缩成一个短的字符串,比如一个字符串ababab你可以转化成3ab,长度为 3,比如bbbacacb转化成3b2a ...
随机推荐
- USB初始化
//USB初始化void CFileManagerDlg::usbinit(){ #define BUFFER_SIZE 64 struct usb_bus *bus; struct usb_devi ...
- 掌握 ActionResult
我在上一篇博客不要停留在表面,MVC 3 我们要深入一些 说明了我们的掌握程度还是不够,还需要我们继续努力.但是有园友质疑说他们认为我说的只是书院派,并不实用,这令作为程序员的我很是生气.好吧,那咱们 ...
- 面试题(C#基础)
1>构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading. 2>string[] ss=Enum.GetNames(typeof(C ...
- oracle日期格式数据修改
select * from INVOICE_NEW where ref_no='32308' update INVOICE_NEW set check_d=to_date('2015/11/16', ...
- 4个好用的JS联动选择插件
jQuery City Select 一个简单的jQuery省市联动插件,可以自定义JSON字典实现其他内容的联动选择菜单. PCAS省.市.地区联动选择JS封装类 PCAS可能是国内使用人数最多的J ...
- Pjax介绍及在asp.net MVC3中使用pjax的简单示例
相信很多人对ajax并不陌生,对ajax的一些优点也了如指掌,如:局部刷新改善用户体验,减少开销,让服务器和浏览器之间的响应更快等. 但是它的缺点也是很显而易见的: AJAX大量的使用了javascr ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- C语言之广度优先算法
广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标结点(结点就是那些圆球球,其中有一个或者多个是目标结点)或者搜完了整个图都没找到目标结点就停止搜索. ...
- 粗略阅读《Agile Software Development》后的感想
大致配合翻译和词典阅读了一下这篇文章之后,我另外还查阅了维基百科.百度百科和MBA智库百科还有一些网络上的文章.对敏捷开发有了一个大致上的浅显的认识. 敏捷建模(Agile Modeling,AM)的 ...
- hdu 1828 Picture(线段树 || 普通hash标记)
http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others) Mem ...