算法:uva 11552

题意

给一个字符串,把它分为k块,例如字符串“helloworld”分成2块,"hello", "world"

每一块里面的字母可以任意的排序。

最终字符串, 连续的一样的字母算 作一个chunk,问总chunks最少是多少?

思路

f[i][j]: 第i块的第j位排在最后一位的最少 chunks

对于每个单独的一块,它的chunks就是等于出现的不同字母数

第i块的chunks记做 chunks[i]

如果第i-1块的最后一位和第i块的第一位是一样的,那么可以合并这两个,总chunks可以 减少一个

f[i][j] = min{  如果i-1块的第k位和i块的第一位不同:  f[i-1][k]+chunks [i],

如果i-1块的第k位和i块的第一位相同:  f[i-1][k]+chunks[i]-1  }

代码

/**==========================================
* This is a solution for ACM/ICPC problem
*
* @source:uva-11552 Fewest Flops
* @type: dp
* @author: shuangde
* @blog: blog.csdn.net/shuangde800
* @email: zengshuangde@gmail.com
*===========================================*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;

typedef long long int64;
const int INF = 0x3f3f3f3f;

const int MAXN = 1010;
int k;
char str[MAXN];
int f[MAXN][MAXN];
bool vis[130];

int main() {

int nCase;

scanf("%d", &nCase);

while (nCase--) {

scanf("%d %s", &k, str);

int len = strlen(str);

// init
memset(f, INF, sizeof (f));

for (int i = 0; i < len / k; ++i) {

// 算出Si有几个chunks
// www.bianceng.cn
int chunks = 0;
memset(vis, 0, sizeof (vis));
for (int j = i * k; j <= (i + 1) * k - 1; ++j) {
vis[str[j]] = true;
}

for (int j = 'a'; j <= 'z'; ++j)
if (vis[j]) ++chunks;

if (i == 0) {
for (int j = 0; j < k; ++j)
f[i][j] = chunks;
continue;
}

for (int j = 0; j < k; ++j) {
int rear = i * k + j;
for (int l = 0; l < k; ++l) {
int pre = (i - 1) * k + l;
if (vis[str[pre]] && (chunks == 1 || str[pre] != str[rear])) {
f[i][j] = min(f[i][j], f[i - 1][l] + chunks - 1);
} else {
f[i][j] = min(f[i][j], f[i - 1][l] + chunks);
}
}
}

}

int ans = INF;
for (int i = 0; i < k; ++i)
ans = min(ans, f[len / k - 1][i]);

printf("%d\n", ans);
}
return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索字符串
, int
, include
, 一个
字母
gb11552、11522、刷单11552、11552.com、gb11552 2009,以便于您获取更多的相关知识。

时间: 2024-12-23 19:10:34

算法:uva 11552的相关文章

算法题之UVA 763

Fibinary Numbers The standard interpretation of the binary number 1010 is 8 + 2 = 10. An alternate way to view the sequence ``1010'' is to use Fibonacci numbers as bases instead of powers of two. For this problem, the terms of the Fibonacci sequence

算法题:UVa 591 Box of Bricks (模拟)

591 - Box of Bricks Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=467&page=show_problem&problem=53 2 Little Bob likes playing with his box of bricks. He puts the bricks one upon an

算法题之UVA 10891

This is a two player game. Initially there are n integer numbers in an array and players A and B get chance to take them alternatively. Each player can take one or more numbers from the left or right end of the array but cannot take from both ends at

算法题:uva 10318

题目链接: 首先,可以确定每个格子只能选一次,因为选任何大于0的偶数次,等于没有效果 一样. 然后,就可以把这题理解成从r*c的矩阵中选择一些格子进行"点亮"操作,使得最终所 有格子都是"亮"的状态.那么,每个格子要么有点亮操作,要么没有,总共复杂度为2^25,显然必须 进行减枝. 假设从第一行第一列开始,从左往右,从上往下一次依次选择,对于当前所在位置( x, y),它已经不能影响到x-2以前的行数了,所以当到x行时,如果第x-2行没有全部点亮,则进行减枝 . 此

算法题:uva 1330

题目链接: http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4076 以前做过一道一维的,这题只是变成了二维的,其他方法都一样.HDU 1506  Largest Rectangle in a Histogram   题解 代码1: #include<cstdio> #include<cs

算法:UVa 11572

题目大意: 给n个数, n<=100W,求一个连续子序列,这个子序列中没有重复的数,问这个子序列最长是多少? 思路: 开一个数组pos,  pos[ x ] 表示x出现的位置, 这个数组初始化为-1 用一个变量start来记录当前枚举序列的起点,初始为0 然后枚举这个序列,依次记录每个数的位置, 假设当前枚举到i, 在记录这个位置之前,先检查当前这个数的位置pos[ arr[i] ]是否大于等于start,如果大于,说明这个数已经在[start, i-1]中已经出现过了,记下这个满足条件的子序列

算法:UVa 11536

题目大意: 给一个序列 X1 = 1 X2 = 2 X3 = 3 Xi = (Xi-1 + Xi-2 + Xi-3) % M + 1         for i = 4 to N 求一段最短的连续子序 列,使得这个子序列包含正整数[1,k] 思路: 扫描一遍即可,用一个队列记录下[1, k]区间内的数的位置,再用一个变量count维护[1,k]内不重复数的个数.当count等于k时说明当前 序列已经满足了要求,而队列头的数的位置就是起始位置. 算法复杂度O(n) 代码: /* * UVa 115

算法:UVa 12174

[题目大意] 你在听音乐播放器,它采用随机播放形式.随机播放的原理时先随机产生一个 1~n的排列,然后就按这个排列顺序播放歌曲.播放完这序列的所有歌曲以后,再次随机生成一个1-n的 排列,再继续播放. 现在给你一个播放历史记录,这个历史记录是不完整的,以为它是开始记录 时,已经有些歌曲播放过了而没有记录到. 现在给你一段从某个时刻开始的播放音乐的历史记录 ,以及播放器里一共有多少首歌. 问历史记录中第一首歌可能是某个随机列表中的第几首,总共 有多少种可能? [思路] 先进行预处理,用一个bool

UVa 10182 Bee Maja:规律&amp;amp;O(1)算法

10182 - Bee Maja Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1123 Maja is a bee. She lives in a bee hive with thousands of other bees. This bee hive c