// 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;
}

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

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

  1. UVa 11552 Fewest Flops (DP)

    题意:给一个字符串,把它分为k块,每一块里面的字母可以任意的排序.最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少? 析:dp[i][j] 表示第 i 个块,第 j 位在末 ...

  2. UVA 11552 Fewest Flops(区间dp)

    一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct 枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间 ...

  3. UVA - 11552 Fewest Flops

    传送门: 题目大意:给你一个字符串,可以平均分成很多段,每一段之内的元素可以任意排序,最后再按原来的顺序把每一段拼起来,问最少的块数.(块:连续相同的一段字符成为一个块) 题解: 首先我们可以发现,每 ...

  4. 多维DP UVA 11552 Fewest Flop

    题目传送门 /* 题意:将子符串分成k组,每组的字符顺序任意,问改变后的字符串最少有多少块 三维DP:可以知道,每一组的最少块是确定的,问题就在于组与组之间可能会合并块,总块数会-1. dp[i][j ...

  5. uva 11552 dp

    UVA 11552 - Fewest Flops 一个字符串,字符串每 k 个当作一组,组中的字符顺序能够重组.问经过重组后改字符串能够编程最少由多少块字符组成.连续的一段字符被称为块. dp[i][ ...

  6. UVA 11552 四 Fewest Flops

    Fewest Flops Time Limit:2000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Statu ...

  7. uva 11584 Partitioning by Palindromes 线性dp

    // uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...

  8. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  9. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

随机推荐

  1. Android javaMail使用imap协议接收邮件

    在这里说明一下,pop3和imap协议都是接收邮件的,但是他们还是有很多不同的. IMAP和POP有什么区别? POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件. ...

  2. Oracle 12CR2 中alert.log出现大量的 WARNING: too many parse errors 告警

    Oracle 12CR2 中alert.log出现大量的 WARNING: too many parse errors 告警   日志如下: 2018-06-24T17:16:21.024586+08 ...

  3. JavaScript系列--JavaScript数组高阶函数reduce()方法详解及奇淫技巧

    一.前言 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. reduce() 可以作为一个高阶函数,用于函数的 compose. reduce()方 ...

  4. Caffe 学习:Crop 层

    在Fully Convolutional Networks(FCN)中,会用到Crop 层,他的主要作用是进行裁切.下面我们举一个例子来说明如何使用Crop 层. Caffe中的数据是以 blobs形 ...

  5. 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息http://xqy266.blogbus.com/logs/66258230.html 在EOS6的项目中,如果采用VC++开发的Active ...

  6. VC ADO “ParameterDirectionEnum”:“enum” 类型等 重定义问题 解决方案

    原因分析: 1.在头文件中: #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace ...

  7. freemarker导出图片到word

    1.word模版制作: 在word中添加图片,第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码: <w:binData w:name=" ...

  8. word中公式的排版及标题列表

    1.首先建好你的标题,如标题1,标题2等等,你能够依次改变它们的字体,段落等格式,新建格式例如以下图所看到的 红圈处即建立新的格式,你能够建立不论什么你想要的格式,非常方便: 2.当你建立好了多个标题 ...

  9. C++ 指针(不论什么一个指针本身的类型都是unsigned long int型)

    1.指针数组: 即 数组的元素是指针型; 例:int*pa[2]; 明明是一维的指针数组.竟当作二维数组用. [cpp] view plain copy //利用指针数组存放单位矩阵 #include ...

  10. 我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘

    几次想照着课本系统地学习Qt,但我发现还是有详细问题驱动时学习比較快. 于是我给自己设定了这个任务: 读取HMC5843的三轴磁场强度值,计算出角度,并把角度用直观形式显示在图形界面上. 这里面涉及到 ...