题目地址: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的更多相关文章

  1. uva 11552 Fewest Flops 线性dp

    // uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...

  2. 区间型DP

    区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...

  3. UVA 11552 四 Fewest Flops

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

  4. 区间型动规--石子归并(Pascal)

    题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...

  5. UVA 11552 Fewest Flops(区间dp)

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

  6. UVA11552:Fewest Flops

    发现如果只有一块就是种类的数目,也就是同种放在一起, 再考虑多块,如果违背的上面的规律,可以发现不会更优, 于是问题就是求在满足同种类放在一起的前提下,尽量使得相邻块的两端一模一样 然后dp一下就可以 ...

  7. UVa 11552 Fewest Flops (DP)

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

  8. 138.括号序列(区间型DP)

    3657 括号序列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 我们用以下规则定义一个合法的括号序列: ...

  9. UVa 11552 DP Fewest Flops

    题解 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...

  10. hdoj1584 蜘蛛牌 (区间型动态规划)

    hdoj1584 分析: f[i][j] 表示 把一串牌 牌 i 到 j 摞为一摞时 所花费最少的步数. d[i][j] 表示把牌 i 挪到牌 j 上时需要走的步数(最初给的状态). 以一串牌 3~8 ...

随机推荐

  1. ADS2008 安装方法详解及文件下载

    一.我的安装的过程及方法 正常安装的方法: 1.- Install the program. 2.- Copy "license.lic" into "C:\ADS200 ...

  2. javascript 生成页面轮播元素

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  3. 【Eclipse】修改java代码不强制重启

    找到tomcat的server.xml文件,修改以下代码,重新发布重启.然后修改java代码就可以不用重启了. 将reloadable=“true”改成reloadable="false&q ...

  4. hibernate报错

    报错二:java.lang.ExceptionInInitializerError java.lang.ExceptionInInitializerError at com.java1234.serv ...

  5. iOS8模拟器键盘弹不出来

    command + k  或 command + shift + k  切换到模拟器键盘 其默认是Mac键盘

  6. Ubuntu上搭建DokuWiki

    1.准备工作 1) 安装Apache sudo apt-get install apache2 2)在浏览器中输入http://localhost 如果现实It works则说明Apache安装成功, ...

  7. 基于Sql Server 2008的分布式数据库的实践(四)

    原文 基于Sql Server 2008的分布式数据库的实践(四) 数据库设计 1.E-R图 2.数据库创建 Win 7 1 create database V3 Win 2003 1 create  ...

  8. Windows Phone 8初学者开发—第19部分:设置RecordAudio.xaml页面

    原文 Windows Phone 8初学者开发—第19部分:设置RecordAudio.xaml页面 原文地址:  http://channel9.msdn.com/Series/Windows-Ph ...

  9. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  10. 敬请贤者:WEB、IOS开发(2年以上经验,大专);CTO、产品经理,运营专员 电商服装鞋饰买手(2年以上经验,服装或鞋类);体验店店长 (2年以上经验,服装或鞋类) 工作地点:丰台南苑路;有意者小窗QQ2211788980 - V2EX

    敬请贤者:WEB.IOS开发(2年以上经验,大专):CTO.产品经理,运营专员 电商服装鞋饰买手(2年以上经验,服装或鞋类):体验店店长 (2年以上经验,服装或鞋类) 工作地点:丰台南苑路:有意者小窗 ...