uva 11552 Fewest Flops 线性dp

// 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] + counts[i]);
//
// 第一种情况的開始和结束字母同样有个前提:
// f[i-1][k]中的k在第i块中出现
//
// 之后的条件是:
// 1)第i块仅仅有一种字符
// 2)第i块结束字符与第i-1块结束字符不同样
//
// ps:第一种情况是另外一种情况的特殊,由于每种字母要么是在開始,
// 要么是在结束,不会连续的两个块结束字母同样,这样肯定不是
// 最优的,而假设第i块仅仅有一种字符。那么显然不在这之列。
//
// wrong answer了10次。如此顽强我也是醉了
//
// 继续练吧
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#define ceil(a,b) (((a)+(b)-1)/(b))
#define endl '\n'
#define gcd __gcd
#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
#define popCount __builtin_popcountll
typedef long long ll;
using namespace std;
const int MOD = 1000000007;
const long double PI = acos(-1.L);

const int maxn = 1008;
const int inf = 0x3f3f3f3f;
char s[maxn];
bool vis[maxn][30];
int f[maxn][300];
int n,k;
int counts[maxn];

void dp(){
	for (int i=0;i<=26;i++){
		if (vis[1][i]){
			f[1][i] = counts[1];
		}
	}

	for (int i=2;i<=n/k;i++){
		for (int j=0;j<26;j++){
			if (vis[i][j]){
				for (int m=0;m<26;m++){
					if (vis[i][m] && (counts[i]==1 || j!=m)){
						f[i][j] = min(f[i][j],f[i-1][m] + counts[i] - 1);
					}else{
						f[i][j] = min(f[i][j],f[i-1][m] + counts[i]);
					}
				}
			}
		}
	}
	int ans = inf;
	for (int i=0;i<26;i++){
		ans = min(ans,f[n/k][i]);
	}
	printf("%d\n",ans);

}
void print(){
	for (int i=1;i<=n/k;i++){
		cout << counts[i] << " ";
	}
	cout << endl;
}
void init(){
	scanf("%d %s",&k,s+1);
	n = strlen(s+1);
	memset(vis,0,sizeof(vis));
	memset(f,inf,sizeof(f));
	memset(counts,0,sizeof(counts));
	int x=1;
	for (int i=1;i<=n;i++){
		if (!vis[x][s[i]-'a']){
			counts[x]++;
			vis[x][s[i]-'a'] = 1;
		}
		if (i%k==0){
			x++;
		}
	}
//	cout << "x = " << x << endl;
//	print();
	dp();
}

int main() {
	int t;
	//freopen("E:\\Code\\1.txt","r",stdin);
	scanf("%d",&t);
	while(t--){
		init();
	}
	return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-12-28 16:13:39

uva 11552 Fewest Flops 线性dp的相关文章

UVA 11552 Fewest Flops

题解: 也是比较简单的DP dp[i][j]表示第i个.以字母j结尾的最小值 注意小trick. 整个分组都同一个字母,这时候就不用判断头尾是否相同了 代码用到了一些c ++ 11的新姿势,auto太强了~ 代码: #include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define lson l,m,rt

多维DP UVA 11552 Fewest Flop

题目传送门 1 /* 2 题意:将子符串分成k组,每组的字符顺序任意,问改变后的字符串最少有多少块 3 三维DP:可以知道,每一组的最少块是确定的,问题就在于组与组之间可能会合并块,总块数会-1. 4 dp[i][j]表示第i组以第j个字符结尾的最少块数,状态转移方程:dp[i][j] = min (dp[i][j], dp[i-1][l] + chunk - 1); 5 意思就是枚举上一组的所有字符,当出现在i组并且不是放到末尾,那么能-1 6 */ 7 /******************

UVA 10271 Chopsticks(线性DP)

In China, people use a pair of chopsticks to get food on the table, but Mr. L is a bit different. He uses a set of three chopsticks – one pair, plus an EXTRA long chopstick to get some big food by piercing it through the food. As you may guess, the l

uva 11552 dp

UVA 11552 - Fewest Flops 一个字符串,字符串每 k 个当作一组,组中的字符顺序可以重组.问经过重组后改字符串可以编程最少由多少块字符组成.连续的一段字符被称为块. dp[i][j] 表式第i组以字符j结尾的最少块数. 那么我们考虑添加一组后可以减少块数的情况. 1):上一组的结尾在这一组里找得到同样的字符,并且该字符不作为当前块的结尾.如果要作为结尾的话要把该字符所在的块拆开,所以然并卵. 2):当前组只有一种字符,并且和上一组的结尾相同. 这两种情况都可以使块数减一 d

UVA 11552 四 Fewest Flops

Fewest Flops Time Limit:2000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11552 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 int main() 6 { 7 int T; 8

uva 11584 Partitioning by Palindromes 线性dp

// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串的数目 // // f[i] = min(f[i],f[j-1] + 1(j到i是回文串)) // // 这道题还是挺简单的,继续练 #include <algorithm> #include <bitset> #include <cassert> #include <

poj3267——线性dp

poj3267——线性dp The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8458   Accepted: 3993 Description Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'

线性DP POJ2279 Mr.Young&#39;s Picture Permutations

Mr. Young's Picture Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1128   Accepted: 562 Description Mr. Young wishes to take a picture of his class. The students will stand in rows with each row no longer than the row behin

uva 12186 Another Crisis 树形dp

// uva 12186 Another Crisis 树形dp // // 对于一个节点u,有k个子节点,则至少有c = (k * T - 1) / 100 + 1才能 // 发信,即c / k >= T / 100,则 c 的值为 k * T /100,上取整变成上式 // 将所有的子节点d从小到大排序,取前c个就是d[u]的值 // 紫书上的一题,之前看了好久好久,觉得挺好的,然而一直没做,今天就来 // 体验体验,挺好的一题,注意一下,如果一个节点是叶节点,直接return 1就好 //