UVA 11552 Fewest Flops
来源:互联网 发布:python 图形界面开发 编辑:程序博客网 时间:2024/06/04 14:32
题意: 输入一个正整数k和字符串s,串的长度保证是k的倍数,把s的字符按照从左到右的顺序每k个分为一组,每组之间可以任意重排,但组之间的先后顺序保持不变。你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母。
解法: 设dp[i][j]为以字母i结尾块数为j的串的最少块数,有如下状态转移:
若块j的元素种类大于1,块j中存在元素x且块j中的元素种类为m,则dp[i][j] = min(dp[i][j], dp[x][j-1]) + m - 1,i为块j中非x的字母,若块j-1不存在字母x,则去掉后面的-1。
若块j的元素种类等于1,假定只存在字符x,则dp[x][j] = min(dp[i][j-1]) + 1,再判断块j-1是否存在x结尾的串,存在则dp[x][j] = min(dp[x][j], dp[x][j-1])。
当给的k等于1时注意判一些细节。
/* **********************************************Author : NeroCreated Time: 2013-8-25 16:21:12Problem id : UVA 11552Problem Name: Fewest Flops*********************************************** *//*需要注意给定k等于1的情况*/#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define REP(i,a,b) for(int i=(a); i<(int)(b); i++)#define clr(a,b) memset(a,b,sizeof(a))const int INF = ~0u>>2;int dp[26][1010];char s[1010];int k,len;int mark[26][1010];int main() { int cas; scanf("%d", &cas); while(cas--) { scanf("%d%s", &k, s+1); len = strlen(s+1); REP(i,0,26) REP(j,1,len+1) dp[i][j] = INF; clr(mark,0); for(int i = 1; i+k-1 <= len; i += k) { int b = i/k + (k != 1), cnt = 0; for(int j = i; j < i+k; j ++) { mark[s[j]-'a'][b] ++; if(mark[s[j]-'a'][b] == 1) cnt ++; } if(cnt == 1) { int c; for(c = 0; c < 26; c ++) if(mark[c][b]) break; if(b == 1) { dp[c][b] = 1; continue; } if(mark[c][b-1]) dp[c][b] = dp[c][b-1]; for(int j = 0; j < 26; j ++) if(mark[j][b-1]) { dp[c][b] = min(dp[c][b], dp[j][b-1] + 1); } } else { for(int c = 0; c < 26; c ++) if(mark[c][b]) { if(b == 1) { dp[c][b] = cnt; continue; } for(int j = 0; j < 26; j ++) if(mark[j][b-1]) { if(mark[j][b] && j != c) dp[c][b] = min(dp[c][b], dp[j][b-1] + cnt - 1); else dp[c][b] = min(dp[c][b], dp[j][b-1] + cnt); } } } } int minx = INF; REP(i,0,26) minx = min(minx, dp[i][len/k]); printf("%d\n", minx); } return 0;}
- UVA 11552 Fewest Flops
- uva 11552 Fewest Flops
- UVA 11552 Fewest Flops
- UVA 11552 Fewest Flops
- UVA - 11552 Fewest Flops
- UVa:11552 - Fewest Flops
- UVA 11552 Fewest Flops
- uva 11552 Fewest Flops
- UVA 11552 Fewest Flops
- Uva 11552 Fewest Flops
- UVA 11552 Fewest Flops
- uva 11552 - Fewest Flops(dp)
- UVA 11552 Fewest Flops(DP)
- FEWEST FLOPS - UVa 11552 dp
- UVA - 11552 Fewest Flops DP
- uva 11552 - Fewest Flops(dp)
- Uva 11552 Fewest Flops (三维动态规划)
- Uva 11552 - Fewest Flops 字符串dp
- 使用 background:url(#) 解决 IE bug
- 如何修改mysql配置,能让局域网用户访问
- Android记录5--关于Android云测试的小思考
- Apache Derby入门
- Entity Frame 关系
- UVA 11552 Fewest Flops
- VMWare workstation 6下SuSE 10安装VMTools步骤(转)
- N2CMS 实践之路 Part.3 第一个页
- openoffice+swftools,客户端代码
- 最无私的Android资料(书籍+代码)分享-不要积分(求置顶)
- .NET C# 不重复随机数的另类生成方式
- 禁用任务管理器(修改注册表与设置键盘钩子)
- “espcms开启静态化,get name=list的第一条数据静态地址的生成不完整”解决办法
- 面向对象设计原则