UVA 11552 Fewest Flops(区间dp)
一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct
枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间出现,如果出现则贪心选块数+ct-1,
枚举当前的结尾。为了方便处理,增加一个0区间,初始为0,这样所有的块数会减1,转移完以后在加上1。
#include<bits/stdc++.h>
using namespace std; const int LEN = 1e3+;
int dp[LEN][];
char s[LEN];
const int INF = 0x3f3f3f3f;
//#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int T; cin>>T;
//for(int i = 1; i < 26; i++) dp[0][i] = 1;
//memset(dp[0],0x3f,sizeof(dp[0]));
while(T--){
int k; scanf("%d%s",&k,s);
int len = strlen(s), mi = len/k;
for(int i = ; i <= mi; i++){
bool exs[] = {};
for(int j = (i-)*k; j < i*k; j++){
exs[s[j]-'a'] = true;
}
int ct = ;
for(int j = ; j < ; j++) ct += exs[j];
memset(dp[i],0x3f,sizeof(dp[i]));
for(int j = ; j < ; j++){
if(dp[i-][j]<INF){
if(exs[j]){
if(ct == ) { dp[i][j] = min(dp[i][j],dp[i-][j]); continue; }
for(int k = ; k < ; k++){
if(exs[k] && k != j){
dp[i][k] = min(dp[i][k],ct-+dp[i-][j]);
}
}
dp[i][j] = min(dp[i][j],ct+dp[i-][j]);
}else {
for(int k = ; k < ; k++){
if(exs[k]){
dp[i][k] = min(dp[i][k],ct+dp[i-][j]);
}
}
} }
}
}
int ans = INF;
for(int j = ; j < ; j++) ans = min(dp[mi][j],ans);
printf("%d\n",ans+);
}
return ;
}
UVA 11552 Fewest Flops(区间dp)的更多相关文章
- uva 11552 Fewest Flops 线性dp
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...
- UVa 11552 Fewest Flops (DP)
题意:给一个字符串,把它分为k块,每一块里面的字母可以任意的排序.最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少? 析:dp[i][j] 表示第 i 个块,第 j 位在末 ...
- UVA - 11552 Fewest Flops
传送门: 题目大意:给你一个字符串,可以平均分成很多段,每一段之内的元素可以任意排序,最后再按原来的顺序把每一段拼起来,问最少的块数.(块:连续相同的一段字符成为一个块) 题解: 首先我们可以发现,每 ...
- 多维DP UVA 11552 Fewest Flop
题目传送门 /* 题意:将子符串分成k组,每组的字符顺序任意,问改变后的字符串最少有多少块 三维DP:可以知道,每一组的最少块是确定的,问题就在于组与组之间可能会合并块,总块数会-1. dp[i][j ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
- uva 10003 Cutting Sticks(区间DP)
题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...
- UVa 1632 阿里巴巴(区间DP)
https://vjudge.net/problem/UVA-1632 题意: 直线上有n个点,其中第i个点的坐标是xi,且它会在di秒之后消失.Alibaba可以从任意位置出发,求访问完所有点的最短 ...
- uva 10739【基础(区间)dp】
Uva 10739 题意:给定字符串,可以增加.删除.修改任意字符,问最少经过多少次操作使字符串回文. 题解:定义dp[l][r]表示把从l到r的子串Sl...Sr变成回文串需要操作的最少次数.字符可 ...
随机推荐
- OSP 与 Session
大家都知道,OSP是不支持session的,换句话说,登录有效期是永久的.一般网站,如果你不操作一段时间以后,必须重新登录.osp不是这样的,你一旦登录后,即便服务器重启了,你依然能访问服务器并不需要 ...
- 如何選擇最佳的 Wi-Fi 無線網路頻道,獲得最佳的傳輸速度(转载)
转自:https://blog.gtwang.org/useful-tools/how-to-find-the-best-wi-fi-channel-for-your-router/
- 数据库路由中间件MyCat - 源代码篇(9)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 3.5 后端连接 3.5.1 后端连接获取与负载均衡 上一节我们讲了后端连接的基本建立和响应 ...
- 使用BCG创建Pie
1.新建一个BCG的对话框,添加一个文本框,并修改属性,添加成员变量,并设置Category为Control. 2.在class CCharPieDlg : public CBCGPDialog修改文 ...
- __stdcall
__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事: 1.参数传递顺序 2.调用堆栈由谁(调用函数或被调用函数)清理 常见的函数调用约定:stdcall cdecl fastcall ...
- 字符环(openjudge 2755)
字符环 总时间限制: 1000ms 内存限制: 65536kB 描述 有两个由字符构成的环.请写一个程序,计算这两个字符环上最长连续公共字符串的长度.例如,字符串“ABCEFAGADEGKABUV ...
- ajax异步传输数据,return返回值为空
今天在项目中遇到了一个问题,就是在定义了一个函数drawHtml(),本意是想在函数运行结束后,返回拼接的字符串,可是函数运行结束后始终返回的是undefined 有BIG的代码: function ...
- oracle 查看 job 日志
select * from user_scheduler_job_log select * from user_scheduler_job_run_details select * from use ...
- Domination
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ , f ...
- C#代码规范整理
命名规范制定意义 1. 方便代码的交流和维护,便于日后自己的再次阅读. 2. 不影响编码的效率,不与大众习惯冲突. 3. 使代码更美观.阅读更方便. 4. 使代码的逻辑更清晰.更易于理解. 名词解释 ...