UVA 11552 序列划分模型 状态设计DP
2014-03-22 10:56
459 查看
这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母算一个块,最后使得所有块最少。
这个其实是个从前往后扫的问题,只要枚举最后一位是哪个,比如i-1块的最后一位是w,且w在第i块中确实有,则 f[i][j]=min(本身,f[i-1][w]+chunks[i]-1), chunks[i]表示该块有本身有多少个小块。
这个其实是个从前往后扫的问题,只要枚举最后一位是哪个,比如i-1块的最后一位是w,且w在第i块中确实有,则 f[i][j]=min(本身,f[i-1][w]+chunks[i]-1), chunks[i]表示该块有本身有多少个小块。
#include <iostream> #include <cstdio> #include <cstring> #define INF 1<<30 char ch[1010]; int rec[1010]; int f[1005][1005]; int vis[1005][200]; int k; int min(int a,int b) { if (a<b) return a; return b; } int main() { int t; scanf("%d",&t); while (t--) { scanf("%d %s",&k,ch); int len=strlen(ch); memset(rec,0,sizeof rec); memset(vis,0,sizeof vis); memset(f,0,sizeof f); for (int i=0;i<len/k;i++) { for (int j=0;j<k;j++) { f[i][j]=INF; } for (int j=i*k;j<(i+1)*k;j++) { vis[i][ch[j]]++; } for (int j='a';j<='z';j++) { if (vis[i][j]) rec[i]++; //计算chunks } } for (int i=0;i<k;i++) { f[0][i]=rec[0]; //预处理第0位 } for (int i=1;i<len/k;i++) { for (int j=0;j<k;j++) { for (int w=0;w<k;w++) { int rear=i*k+j; int pre=(i-1)*k+w; if (vis[i][ch[pre]] &&(rec[i]==1 || ch[pre]!=ch[rear])) //如果第i位有第i-1位的该字母,则,除非第i位的chuanks=1,否则就必须第i位的最后一位不为该字母(该字母要放在序列头,则满足该条件) { f[i][j]=min(f[i][j],f[i-1][w]+rec[i]-1); } else { f[i][j]=min(f[i][j],f[i-1][w]+rec[i]); } } } } int ans=INF; for (int i=0;i<k;i++) { ans=min(ans,f[len/k-1][i]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- UVa 11552 最小的块数(序列划分模型:状态设计)
- UVA-11552-Fewest Flops(DP 序列划分)
- UVA 11552 Fewest Flops(序列划分dp)
- UVa 11552 - Fewest Flops(DP,状态设计)
- uva_11552_Fewest Flops( 经典DP模型 )
- UVA 11552 Fewest Flops (序列划分DP,4级)
- UVA 11552 Fewest Flops (序列划分DP,4级)
- Hacker's Crackdown(UVa 11825)状态压缩dp+数学模型
- 面向对象设计——系统动态模型设计(2,状态模型)
- Uva 11552 - Fewest Flops 字符串dp
- UVA 1252 Twenty Questions 状态压缩dp 记忆化搜索
- uva 11825 ,Hacker's Crackdown 状态压缩 dp
- LA4256 UVa11552 dp状态设计
- uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
- UVa 10817 - Headmaster's Headache ( 状态压缩dp)
- Dropping water balloons UVA - 10934 (dp,状态比较难想)
- Vacation+uva+简单dp(最长公共升子序列)
- UVALive 6625 Diagrams & Tableaux (状态压缩DP)
- uva 11552(dp)
- poj 3661 Running(dp,设计状态,)