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

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

最新文章

  1. WPF阴影效果(DropShadowEffect)
  2. canvas 拖拽实现
  3. JAVA中的异常及处理异常的方法
  4. 安装 composer SSL operation failed with code 1
  5. 腾讯优测干货精选| 安卓开发新技能Get -常用必备小工具汇总
  6. android退出登陆后,清空之前所有的activity,进入登陆主界面
  7. UNIX基础知识之时间值
  8. PHP中::、-&gt;、self、parent::、$this操作符的区别
  9. 为EditText设置OnTouchListener事件监听
  10. 《音乐商店》第4集:自动生成StoreManager控制器
  11. Java+大数据开发——Hadoop集群环境搭建(二)
  12. Drupal8 入门教程(一)安装部署
  13. docker-compose安装redis-sentinel集群(1主+2副+2哨兵)
  14. The Chinese Postman Problem HIT - 2739(有向图中国邮路问题)
  15. 快递小哥逆袭自传:用了6年时间做到了IT部门主管
  16. PHP 正则表达式--转(川山甲)
  17. Python:线程指南
  18. Serverless架构详解:开发者如何专注于业务代码本身?
  19. C# openfiledialog的使用
  20. gulp使用 实现文件修改实时刷新

热门文章

  1. Windows下合并tar分卷
  2. Mosquito的优化——订阅树优化(八)
  3. UIButton UIBarButtonItem用法
  4. DSO Framer _ WinForm 使用
  5. 7、基于嵌入式Linux的视频采集系统---UVC驱动模型介绍
  6. 【例题3-2 UVA - 10082】WERTYU
  7. PWA之Service work
  8. ios开发缓存处理类NSCash类的了解与使用
  9. 事件处理之一:两种方式:监听器与回调 分类: H1_ANDROID 2013-10-31 10:26 3250人阅读 评论(0) 收藏
  10. Sub-process /usr/bin/dpkg returned an error code (1)错误解决办法