https://vjudge.net/problem/UVA-11552

题意:
输入一个正整数k和字符串S,字符串的长度保证为k的倍数。把S的字符按照从左到右的顺序每k个分成一组,每组之间可以任意重排,但组与组之间的先后顺序应保持不变。你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母。

思路:

令d【i】【j】表示第i组中第j位为末尾时的最小块数。

对于第【i】组,我们首先计算出它的块数,即不同字母的个数。

接下来枚举【i】组中第j个字母作为末尾时的情况,根据第【i-1】组中的字母,如果【i-1】中有和第【i】组相同的字母,此时如果【i】组只有一个块或者相同的字母不在【i】组末尾时:

d[i][j]=min(d[i][j],d[i-][p]+chunk-);

这样就可以前后相同的相连,减少一个块。

没有相同的字母的话那就只能是两者块相加了:

d[i][j]=min(d[i][j],d[i-][p]+chunk);
 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long LL;
typedef pair<int,int> pll;
const int INF=0x3f3f3f3f;
const int maxn=+; int k;
char str[maxn];
int d[maxn][maxn];
int vis[]; int main()
{
//freopen("D:\\input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&k);
scanf("%s",&str);
int len=strlen(str);
memset(d,INF,sizeof(d)); for(int i=;i<len/k;i++)
{
memset(vis,,sizeof(vis));
for(int j=;j<k;j++)
{
int t=i*k+j;
vis[str[t]]=;
} int chunk=;
for(int c='a';c<='z';c++)
if(vis[c]) chunk++; if(i==) //第一组的话直接赋值
for(int j=;j<k;j++)
d[i][j]=chunk;
else
{
for(int j=;j<k;j++)
{
int t=i*k+j;
for(int p=;p<k;p++) //考虑第i-1组的各个字母
{
int pre=(i-)*k+p;
if(vis[str[pre]] && (chunk==||str[pre]!=str[t]))
d[i][j]=min(d[i][j],d[i-][p]+chunk-);
else d[i][j]=min(d[i][j],d[i-][p]+chunk);
}
}
}
} int ans=INF;
for(int i=;i<k;i++)
ans=min(ans,d[len/k-][i]);
printf("%d\n",ans);
}
return ;
}

UVa 11552 最小的块数(序列划分模型:状态设计)的更多相关文章

  1. UVA 11552 序列划分模型 状态设计DP

    这个题目刚看到还真不好下手,把一个是 k的倍数的长度的字符串分成len/k块,每块是k个字母,每个块可以重新组合,最后使得整个序列的相同字母尽量在一起,也就是说,最后会把序列从前往后扫,相连的相同字母 ...

  2. 多维DP UVA 11552 Fewest Flop

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

  3. uva 11552 dp

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

  4. uva 11552 Fewest Flops 线性dp

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

  5. UVA 11552 四 Fewest Flops

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

  6. 【BZOJ3894】【Luogu3358】文理分科 - 最小割多选一模型

    链接Click Here 这个题就是个板子的最小割多选一模型啦\(QwQ\),这里介绍一种通用的解法. 抛开组合收益不谈,这个题就是一个简单的最小割模型.我们只需要建出来这样一张图,在上面跑最小割,割 ...

  7. 漫谈四种神经网络序列解码模型【附示例代码】 glimpse attention

    漫谈四种神经网络序列解码模型[附示例代码] http://jacoxu.com/encoder_decoder/ [视觉注意力的循环神经网络模型]http://blog.csdn.net/leo_xu ...

  8. uva 1608 不无聊的序列

    uva 1608 不无聊的序列 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=2 ...

  9. [源码解析] PyTorch 流水线并行实现 (2)--如何划分模型

    [源码解析] PyTorch 流水线并行实现 (2)--如何划分模型 目录 [源码解析] PyTorch 流水线并行实现 (2)--如何划分模型 0x00 摘要 0x01 问题 0x01 自动平衡 1 ...

随机推荐

  1. linux动态查看某组进程状态的办法

    这里记录一下我监控某组进程的解决办法. 1.首先要获取要监控的进程的进程id,如果你要勇ps grep 那你就out了,强大的linux系统有一个pidof命令,用来查找相关进程的进程id,其实还有一 ...

  2. OC开发_Storyboard——多线程、UIScrollView

    一.多线程 1.主队列:处理多点触控和所有UI操作(不能阻塞.主要同步更新UI) dispatch_queue_t mainQueue = dispatchg_get_main_queue(); // ...

  3. 豆瓣API接口开发,结合angularJS来做,感觉爽歪歪!

    第一次做还是先说下API 是什么鬼? API : application program interface 应用程序编程接口: 有那些常见的API: webAPI : 通过WEB方式提供结构叫 WE ...

  4. 树链剖分-点的分治(dis[i]+dis[j]==k的点对数量)

    poj2114 Boatherds Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1195   Accepted: 387 ...

  5. Morris InOrder Traverse Binary Tree 无需使用递归和栈

    今天在切leetcode的时候看到一个Morris算法,用来中序遍历二叉树,非递归,O(1)空间.觉得很强大.记录一下. 基本思想是利用了Threaded Binary Tree. 步骤如下: cur ...

  6. Gitlab安装和使用

     GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.        GitLab拥有与Github类似 ...

  7. LightGBM值参数配置

    LightGBM 可以使用一个 pairs 的 list 或一个字典来设置参数: 1.Booster提升器的参数: param={'num_class':33, 'boosting_type':'gb ...

  8. Allocation Sinking Optimization

    LuaJIT Sponsorship Program http://luajit.org/sponsors.html Sponsorship for allocation/store sinking ...

  9. (ubuntu ufw)My firewall is blocking network connections from the docker container to outside

    Maybe this is due to the current version, but the current answer doesn't work on my system (Docker 0 ...

  10. find the safest road---hdu1596(最短路模板求最大概率)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1596 求给定的任意两点之间的最大安全概率,概率之间是相乘的关系,所以注意初始化即可 #include& ...