100道动态规划——7 UVA 1630 folding 因为自己考虑的不周全WA了好几发。。。递推,KMP求子串周期
2016-11-03 11:41
369 查看
因为自己考虑不周全的缘故WA了好十几发。。后来找到一个好测试数据才弄出来。。特别感谢http://blog.csdn.net/getupdown/article/details/49542145 提供的测试数据
首先是子串求周期的问题,第一反应用KMP来解决,然后KMP也调试了一会儿。。
然后就是写递推,最后通过一个print函数来重构解。
恩,状态转移方程是很好想到的,但是有细节需要注意。
设dp[i][j]表示从i~j的子串的最小长度(下标从1开始)
那么dp[i][j]有两种转移方式,第一种是自己本身就是周期串
也需要判断一下,看能不能折叠,假如周期串+数字的长度+括号的长度比本身还要长的话,那就不用折叠了
假若可以折叠的话,那么此时的长度就是2(括号)+getbit(length/(length-next[i]j])(这是数字的长度)+dp[i][i+length-next[i][j]+1](特别注意!虽然是+一个周期的长度,但是不能直接+length-next[i][j],而是应该+dp[i][i+length-next[i][j]+1],表示+上这个周期串的最小长度,因为周期串本身可以折叠的缘故,我就是在这里WA了10发左右,自己默认+上了一个周期串的原长)
第二种就是由两个子串拼接而成
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])对于所有的i<=k<j来说
最后的print反着打印一遍就好了,我相信假若做了UVA 2541 Brackets Sequence的话,这个重构解应该不是难事。
getNext表示把KMP的next数组求出来,print(int i,int length)表示打印下标为i,长度为length的子串,getbit拿到一个数字的长度。
顺便说一下那一组数据:
NEEEEEEEEEEEEERYESYESYESYESEEEEEERYESYESYESYES
答案是:
N7(E)2(6(E)R4(YES))
首先是子串求周期的问题,第一反应用KMP来解决,然后KMP也调试了一会儿。。
然后就是写递推,最后通过一个print函数来重构解。
恩,状态转移方程是很好想到的,但是有细节需要注意。
设dp[i][j]表示从i~j的子串的最小长度(下标从1开始)
那么dp[i][j]有两种转移方式,第一种是自己本身就是周期串
也需要判断一下,看能不能折叠,假如周期串+数字的长度+括号的长度比本身还要长的话,那就不用折叠了
假若可以折叠的话,那么此时的长度就是2(括号)+getbit(length/(length-next[i]j])(这是数字的长度)+dp[i][i+length-next[i][j]+1](特别注意!虽然是+一个周期的长度,但是不能直接+length-next[i][j],而是应该+dp[i][i+length-next[i][j]+1],表示+上这个周期串的最小长度,因为周期串本身可以折叠的缘故,我就是在这里WA了10发左右,自己默认+上了一个周期串的原长)
第二种就是由两个子串拼接而成
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])对于所有的i<=k<j来说
最后的print反着打印一遍就好了,我相信假若做了UVA 2541 Brackets Sequence的话,这个重构解应该不是难事。
getNext表示把KMP的next数组求出来,print(int i,int length)表示打印下标为i,长度为length的子串,getbit拿到一个数字的长度。
#include <cstdio> #include <algorithm> #include <cstring> using std::min; char str[110]; inline int getbit(int x){ if(x>=100) return 3; else if(x>=10) return 2; else return 1; } int len,dp[105][105],next[105][105]; void getNext(),print(int i,int length); int main(){ for(int i=1;i<=100;++i) next[i][i-1]=-1; while(scanf("%s",str+1)!=EOF){ len=strlen(str+1); for(int i=1;i<=len;++i) dp[i][i]=1; getNext(); for(int length=2,i=1;length<=len;++length,i=1) for(int j=length;j<=len;++j,++i){ if((length)%(length-next[i][j])==0&&length>=2+getbit((length)/(length-next[i][j]))+length-next[i][j]) dp[i][j]=2+getbit((length)/(length-next[i][j]))+dp[i][i+length-next[i][j]-1]; else dp[i][j]=length; for(int k=i;k<j;++k) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); } print(1,len); printf("\n"); memset(dp,0,sizeof dp); } return 0; } void getNext(){ for(int i=1;i<=len;++i) for(int j=i,p=next[i][j-1];j<=len;p=next[i][++j-1]){ while(p>=0&&str[j]!=str[i+p])p=next[i][i+p-1]; next[i][j]=p+1; } } void print(int i,int length){ if(length==1){ printf("%c",str[i]); return; } int j=i+length-1; if(length%(length-next[i][j])==0&&length>=2+getbit(length/(length-next[i][j]))+length-next[i][j]&&dp[i][j]==2+getbit((length)/(length-next[i][j]))+dp[i][i+length-next[i][j]-1]){ printf("%d(",length/(length-next[i][j])); print(i,length-next[i][j]); printf(")"); return; } for(int k=i;k<j;++k) if(dp[i][j]==dp[i][k]+dp[k+1][j]){ print(i,k-i+1); print(k+1,j-k); return; } }
顺便说一下那一组数据:
NEEEEEEEEEEEEERYESYESYESYESEEEEEERYESYESYESYES
答案是:
N7(E)2(6(E)R4(YES))
相关文章推荐
- 100道动态规划——8 UVA 1631 Locker 递推,状态的定义以及状态转移方程
- 100道动态规划——26 UVA 12099 The Bookcase 状态的定义,递推,背包
- 100道动态规划——24 UVA 1633 Dyslexic Gollum 状态压缩DP 挺好的题 因为窝没想到嘛
- 100道动态规划——13 UVA 10163 Storage Keepers 有约束条件下的DP,递推,不能使用结构体作为基本单位
- 100道动态规划——4 UVA 1331 Maximum Triangulation DP 计算几何
- 100道动态规划——30 UVAlive 3907 Puzzle AC自动机上的动态规划,记忆化搜索
- 100道动态规划——37 UVA 1218 Perfect Service 树形DP 分析问题
- 100道动态规划——5 UVA 10118 Free Candies 记忆化搜索 以及 证明状态
- 100道动态规划——19 UVA 12105 Bigger is Better 状态的定义以及转移方程
- 100道动态规划——32 UVA 12170 Easy Climb 通过分析减少状态数 单调队列
- 100道动态规划——25 UVA 1204 Fun Game 状态压缩 圆圈的处理 (100道完成了1/4啦)
- 动态规划,递推,高精度(Matches,uva 11375)
- 100道动态规划——17 UVA 10934 Dropping water balloons 猜数问题
- 100道动态规划——34 UVA 10559 Blocks 状态的定义 状态转移方程
- 100道动态规划——2 UVA 1625 Color Length DP 转移的代价稍微难写一点 顺便贴了刘汝佳的代码
- 动态规划,递推,多段图(Ingenuous Cubrency,uva 11137)
- 100道动态规划——15 UVA 10618 Tango Tango Insurrection 复杂的转移方程。。
- 100道动态规划——16 UVA 1627 Team them up! 二分图,背包,不过关键还是学会转化
- 100道动态规划——36 UVA 1220 Party at Hali-Bula 树形DP 最大独立集 思考欠妥
- 100道动态规划——29 UVALive 5766 GRE Words AC自动机上的动态规划