UVA11552------FEWEST FLOPS------区间型的DP
题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2547
题目意思:
给你一个字符串,长度为k的整数倍,要你分成每个长度的段
每个段内可以重新编排
连续的几个字母看作一个块
问最少有几个块
解题思路:
对于每个段来说,我们可以知道最少的块,即里面有几种字母,记为chunk[i]
我们设f[i][j]为第i段的第j位放在最末尾时的最少块数
则针对第i-1块的第l个放在末尾时来说
如果和第i的第一个相同,则可以合并一个块,则
f[i][j] = min(f[i][j],f[i-1][l]+chunk-1);
否则
f[i][j] = min(f[i][j],f[i-1][l]+chunk);
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = 1010; int f[maxn][maxn];
char s[maxn];
bool vis[maxn]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int k,len;
scanf("%d",&k);
scanf("%s",s);
len = strlen(s);
memset(f,0x3f3f3f3f,sizeof(f));
for(int i=1;i<=len/k;i++)
{
memset(vis,false,sizeof(vis));
for(int j=1;j<=k;j++)
{
vis[s[(i-1)*k+j-1]] = true;
}
int chunk = 0;
for(int j='a';j<='z';j++)
if(vis[j])
chunk++;
if(i==1)
{
for(int j=1;j<=k;j++)
f[1][j] = chunk;
continue;
} for(int j=1;j<=k;j++)
{
int rear = (i-1)*k+j-1;
for(int l=1;l<=k;l++)
{
int pre = (i-2)*k+l-1;
if(vis[s[pre]] && (chunk==1 || s[pre]!=s[rear]))
f[i][j] = min(f[i][j],f[i-1][l]+chunk-1);
else
f[i][j] = min(f[i][j],f[i-1][l]+chunk);
}
}
} int ans = 0x3f3f3f3f;
for(int i=1;i<=k;i++)
ans = min(ans,f[len/k][i]);
printf("%d\n",ans);
}
return 0;
}
UVA11552------FEWEST FLOPS------区间型的DP的更多相关文章
- uva 11552 Fewest Flops 线性dp
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
- UVA 11552 四 Fewest Flops
Fewest Flops Time Limit:2000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Statu ...
- 区间型动规--石子归并(Pascal)
题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...
- UVA 11552 Fewest Flops(区间dp)
一个区间一个区间的考虑,当前区间的决策只和上一次的末尾有关,考虑转移的时候先统计当前区间出现过的字母以及种数ct 枚举上一个区间的末尾标号j,规定小于INF为合法状态,确定j之后看j有没有在当前的区间 ...
- UVA11552:Fewest Flops
发现如果只有一块就是种类的数目,也就是同种放在一起, 再考虑多块,如果违背的上面的规律,可以发现不会更优, 于是问题就是求在满足同种类放在一起的前提下,尽量使得相邻块的两端一模一样 然后dp一下就可以 ...
- UVa 11552 Fewest Flops (DP)
题意:给一个字符串,把它分为k块,每一块里面的字母可以任意的排序.最终字符串, 连续的一样的字母算作一个chunk,问总chunks最少是多少? 析:dp[i][j] 表示第 i 个块,第 j 位在末 ...
- 138.括号序列(区间型DP)
3657 括号序列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 我们用以下规则定义一个合法的括号序列: ...
- UVa 11552 DP Fewest Flops
题解 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...
- hdoj1584 蜘蛛牌 (区间型动态规划)
hdoj1584 分析: f[i][j] 表示 把一串牌 牌 i 到 j 摞为一摞时 所花费最少的步数. d[i][j] 表示把牌 i 挪到牌 j 上时需要走的步数(最初给的状态). 以一串牌 3~8 ...
随机推荐
- java读取远程url图片,得到宽高
链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100nrb6.html import java.io.IOException;import java.awt ...
- javascript时间函数
//时间函数 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完 ...
- tabbar动画切换
效果1: UIViewController *vc = self.viewControllers[self.selectedIndex]; CATransition *animation =[CATr ...
- Asp.Net Core
开源Asp.Net Core小型社区系统 源码地址:Github 前言 盼星星盼月亮,Asp.Net Core终于发布啦!! Asp.Net发布时我还在上初中,没有赶上.但是Asp.Net Core我 ...
- ognl--数据运转的催化剂
原文链接:http://struts2.group.iteye.com/group/wiki/1353-ognl-catalyst-for-data-operation-in-struts2 首先让我 ...
- 转:js包装DOM对象
我们在日常的应用中,使用Javascript大多数时间都是在用DOM ,以致于很多人都有一种看法就是DOM==JS,虽然这种看法是错误的,但是也可以说明DOM的重要性. 这就导致了我们在写JS的时候, ...
- yii_wiki_145_yii-cjuidialog-for-create-new-model (通过CJuiDialog来创建新的Model)
/**** CJuiDialog for create new model http://www.yiiframework.com/wiki/145/cjuidialog-for-create-new ...
- shell脚本中每次读取文件的一行
写法一: #!/bin/bash while read linedo echo $line #这里可根据实际用途变化 done < file #需要读取的文件 ...
- OGR SQL
The OGRDataSource supports executing commands against a datasource via the OGRDataSource::ExecuteSQL ...
- 提高mysql查询效率的六种方法
1,表设计一定要优化,冗余数据最少,少用连接查询.如果在实际应用中,使用了极其复杂的连接,子查询,则数据表的设计得要重新考虑了. 2,尽量用char而不是varchar,因为固定长度得string用起 ...