UVA 11552 四 Fewest Flops】的更多相关文章

Fewest Flops Time Limit:2000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11552 #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { int T; int k,numk; int…
题解 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; + ; ; int n, k; char s[maxn]; int d[maxn][maxm]; int cnt[maxn]; bool vis[maxn][maxm]; int main() { int T; scanf("%d", &T); while(T--) { scanf…
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i][j]它代表前i字母j为结尾的最小分块数 // // 假设第i块的開始字母与第i-1块的结束字母同样 // f[i][j] = min(f[i][j],f[i-1][k] + counts[i] - 1); // // 否则 // // f[i][j] = min(f[i][j],f[i-1][k…
题目传送门 /* 题意:将子符串分成k组,每组的字符顺序任意,问改变后的字符串最少有多少块 三维DP:可以知道,每一组的最少块是确定的,问题就在于组与组之间可能会合并块,总块数会-1. dp[i][j]表示第i组以第j个字符结尾的最少块数,状态转移方程:dp[i][j] = min (dp[i][j], dp[i-1][l] + chunk - 1); 意思就是枚举上一组的所有字符,当出现在i组并且不是放到末尾,那么能-1 */ /********************************…
UVA 11552 - Fewest Flops 一个字符串,字符串每 k 个当作一组,组中的字符顺序能够重组.问经过重组后改字符串能够编程最少由多少块字符组成.连续的一段字符被称为块. dp[i][j] 表式第i组以字符j结尾的最少块数. 那么我们考虑加入一组后能够降低块数的情况. 1):上一组的结尾在这一组里找得到相同的字符,而且该字符不作为当前块的结尾. 假设要作为结尾的话要把该字符所在的块拆开.所以然并卵. 2):当前组仅仅有一种字符,而且和上一组的结尾相同. 这两种情况都能够使块数减一…
题意:给一个字符串,把它分为k块,每一块里面的字母可以任意的排序.最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少? 析:dp[i][j] 表示第 i 个块,第 j 位在末尾时chunk最少,状态转移方程也应该好写,如果 dp[i-1][j] 和第 i 块第一个一样,那么就总数就会-1, 否则就是直接加上. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <c…
一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct 枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间出现,如果出现则贪心选块数+ct-1, 枚举当前的结尾.为了方便处理,增加一个0区间,初始为0,这样所有的块数会减1,转移完以后在加上1. #include<bits/stdc++.h> using namespace std; ; ]; char s[LEN]; const int INF =…
传送门: 题目大意:给你一个字符串,可以平均分成很多段,每一段之内的元素可以任意排序,最后再按原来的顺序把每一段拼起来,问最少的块数.(块:连续相同的一段字符成为一个块) 题解: 首先我们可以发现,每一个段之内先排好序,然后如果相邻的两端有相同的元素,就可以把这两个元素分别放在尾和首,就可以减少一个块了.于是一个贪心的做法油然而生:每次对于相邻的两段,如果有相同的元素,就可以把他们放在一起,也就是答案-1.但是显然有问题,如果这一个块与上一个,这一个块与下一个是相同的公共的字符,且有且仅有一种公…
发现如果只有一块就是种类的数目,也就是同种放在一起, 再考虑多块,如果违背的上面的规律,可以发现不会更优, 于是问题就是求在满足同种类放在一起的前提下,尽量使得相邻块的两端一模一样 然后dp一下就可以了 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #define MAXN 1005 using namespace std; int n,k; char s[M…
https://vjudge.net/problem/UVA-11552 题意:输入一个正整数k和字符串S,字符串的长度保证为k的倍数.把S的字符按照从左到右的顺序每k个分成一组,每组之间可以任意重排,但组与组之间的先后顺序应保持不变.你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母. 思路: 令d[i][j]表示第i组中第j位为末尾时的最小块数. 对于第[i]组,我们首先计算出它的块数,即不同字母的个数. 接下来枚举[i]组中第j个字母作为末尾时的情况,根据第[i-1]…