uva 11552 dp
UVA 11552 - Fewest Flops
一个字符串,字符串每 k 个当作一组,组中的字符顺序能够重组。问经过重组后改字符串能够编程最少由多少块字符组成。连续的一段字符被称为块。
dp[i][j] 表式第i组以字符j结尾的最少块数。
那么我们考虑加入一组后能够降低块数的情况。
1):上一组的结尾在这一组里找得到相同的字符,而且该字符不作为当前块的结尾。
假设要作为结尾的话要把该字符所在的块拆开。所以然并卵。
2):当前组仅仅有一种字符,而且和上一组的结尾相同。
这两种情况都能够使块数减一
dp[i][s] = min(dp[i-1][t] + cnt[i] - flag);flag表示是否满足上述两种情况。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 999999999;
char s[1005];
int c[1005][26];
int dp[1005][26];
int _cnt[1005];
int k, len;
int main() { // freopen("out.txt", "w", stdout);
int Tcase;
scanf ("%d", &Tcase);
for (; Tcase>0; --Tcase) {
scanf ("%d%s", &k, s);
len = strlen(s);
int _c=-1;
memset(c, 0, sizeof(c));
memset(_cnt, 0, sizeof(_cnt));
while (_c<len/k) {
for (int j=0; j<k; j++) {
if (c[_c][s[_c*k+j]-'a'] == 0) _cnt[_c]++;
c[_c][s[_c*k+j]-'a']++;
}
_c++;
}
for (int i=0; i<=_c; i++) {
for(int j=0; j<26; j++) {
dp[i][j] = INF;
}
}
for (int i=0; i<26; i++) {
if (c[0][i] != 0) dp[0][i] = _cnt[0];
else dp[0][i] = INF;
}
for (int i=1; i<_c; i++) {
for (int s=0; s<26; s++) {
for (int t=0; t<26; t++) {
if (c[i][s] == 0) continue;
if (c[i-1][t] == 0) continue;
if (c[i][t] != 0 && (_cnt[i] == 1 || s != t)) {
dp[i][s] = min(dp[i][s], dp[i-1][t] + _cnt[i] - 1);// cout << s << " " << t << endl;
} else {
dp[i][s] = min(dp[i][s], dp[i-1][t] + _cnt[i]);
}
}
}
}
int ans = INF;
for (int i=0; i<26; i++) {
ans = min(ans, dp[_c-1][i]);
}
printf ("%d\n", ans);
}
return 0;
}
uva 11552 dp的更多相关文章
- UVA - 11552 DP 划分
每k个字符划分一个组,该组内字符顺序可以任意重排,定义块为最长的连续的字符子串,求长度为m*k的字符串中最少的块的数目 设\(dp[i][j]\):前\(i\)组中第\(i\)组结尾为\(j\)的最优 ...
- UVa 11552 DP Fewest Flops
题解 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...
- 多维DP UVA 11552 Fewest Flop
题目传送门 /* 题意:将子符串分成k组,每组的字符顺序任意,问改变后的字符串最少有多少块 三维DP:可以知道,每一组的最少块是确定的,问题就在于组与组之间可能会合并块,总块数会-1. dp[i][j ...
- uva 11552 Fewest Flops 线性dp
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...
- UVA 11552 四 Fewest Flops
Fewest Flops Time Limit:2000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Statu ...
- UVa 11552 Fewest Flops (DP)
题意:给一个字符串,把它分为k块,每一块里面的字母可以任意的排序.最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少? 析:dp[i][j] 表示第 i 个块,第 j 位在末 ...
- UVA 11552 Fewest Flops(区间dp)
一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct 枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间 ...
- UVA 11552 序列划分模型 状态设计DP
这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母 ...
- uva 1401 dp+Trie
http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- Linux命令(007) -- systemctl
systemctl命令是系统服务管理指令,它实际上是将service和chkconfig两个命令组合到一起. 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd ...
- 为什么,博主我要写下这一系列windows实用网络?
发现,随着自身一路过来所学,无论在大数据领域.还是linux or windows里,菜鸟的我慢慢在长大.把自己比作一个园,面积虽在增加,涉及面增多,但圆外的东西,还是那么多. 现在,正值在校读研 ...
- Spring Boot (27) actuator服务监控与管理
actuaotr是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...
- 由一维数组表示的N维数组实现(C++)
工作中,经常需要表示多维数组(如二维矩阵),常见的做法是使用T **pArr: T **pArr = new T*[M];//创建二维数组[M][N] ;i<M;i++) { pArr[i] = ...
- CSS 按钮特效(二)
1 案例 2. HTML 代码 <div class="arrow arrow-left-middle"> arrow-left-middle </div> ...
- 盒子模型,top和margin-top
1. 标准盒子模型: width只是内容的宽度. 元素的总宽度=width + padding*2 +border*2 +margin*2. IE盒子模型: width=内容的宽度 + padding ...
- ubuntu系统nginx+Redis+PHP
一.安装ngnix apt-get update sudo apt-get install nginx /etc/init.d/nginx start 二.安装php sudo apt-get ins ...
- jstree -- 使用JSON 数据组装成树
概述: 前面主要是html数据,这里主要是json数组 1.格式 jsTree需要一个具体格式JSON数据,在标准的语法没有那个字段是必须的-而是那些是你需要的.请记住你可以获取任何你请求的其他属性, ...
- SDK_进度条和滑块
进度条和滑块 进度条和滑块属于通用控件,通用控件的使用需要加 CommCtrl.h 头文件 如何初始化进度条和滑块的数值范围和默认的位置 // 设置默认的范围值SendDlgItemMessage(h ...
- 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换
学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...