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& ...
随机推荐
- Silverlight环境配置
今天对Silverlight安装环境进行了配置,本系统已经安装VS2010 和 Silverlight 5. 要开发Silverlight必须安装Developer Runtime 和 SDK , 且 ...
- .net面试题 2016
经典面试题2016——50题 1.面向对象语言具有——继承性——,——封装性——,——多态性—— 继承性:就是让一个类型的对象拥有另一个类型的对象的属性的方法.继承后,子类拥有父类的属性和方法. 封装 ...
- Spring框架学习-Spring和IOC概述
一:什么是Spring框架? spring是一个分层的javase/EEfull-stack(一站式)轻量级的java开源框架.是为了解决企业开发的复杂性而创建的.框架的主要优势是分层架构,Sprin ...
- (三)Mybatis总结之动态sql
动态sql 为何需要动态sql?因为简单的sql语句已经不能满足复杂的业务需求 动态sql相当于sql语句拼接 1.if语句 if语句:判断,如果执行多条件查询,如果中间某个条件变量为空,就跳过当前判 ...
- leetcode264 Ugly Number II
思路: 新生成的数字一定是原来的某个数字乘以2.3或5,为了得到最小的一个,需要用三个指针记录原数字的位置以供比较.为了避免重复,生成新数字以后,原数字对应的指针需要后移一下. 实现: class S ...
- handlesocket.md
[介绍](http://www.uml.org.cn/sjjm/201211093.asp ) * 查看启动参数 `service mariadb status > st.txt` ...
- Spring框架之控制反转和依赖注入
学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明控制反转和依赖注入. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权 ...
- Anniversary Cake
Anniversary Cake Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15704 Accepted: 5123 ...
- Django基础核心技术之Model模型的介绍与设计
Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Mode ...
- BZOJ1013 + BZOJ1923 + POJ1830 (高斯消元)
三个题放在一起写了 主要是搞搞模板 在这里简述一下怎么写高斯消元 就和代数里学的加减消元学的一样 把矩阵化为上三角形形式 然后进行回代 同时枚举当前要消元的未知数和当前化简到哪一行了 然后从这一行往后 ...