tijie

时间限制: 2 Sec  内存限制: 256 MB

题目描述

有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数。得到的新字
符和分数由这 k 个字符确定。你需要求出你能获得的最大分数。

输入

第一行两个整数n,k。接下来一行长度为n的01串,表示初始串。接下来2k行,每行一个字符ci和一个整数wi,ci
表示长度为k的01串连成二进制后按从小到大顺序得到的第i种合并方案得到的新字符,wi表示对应的第i种方案对应
获得的分数。1<=n<=300,0<=ci<=1,wi>=1,k<=8

输出

输出一个整数表示答案

样例输入

3 2
101
1 10
1 10
0 20
1 30

样例输出

40
//第3行到第6行表示长度为2的4种01串合并方案。00->1,得10分,01->1得10分,10->0得20分,11->1得30分。
  这道题当时是按照搜索或动归去做的,然而,想不出动归状态咋搞啊,于是乎,花了不到半个小时打了一个MLE的爆搜果断挂了,爆零。
  其实正解真的是DP,只是状态蛮有意思的,这是一种区间动归的思想,因为他合并只是一段串合并,对左右两端的串无直接影响而n,k也不大,因此我们考虑一下状压,当时不是没想过这点,只是压什么,怎么压是个问题,我们自然是不可能去压全串的状态,但我们可以稍微算一下,区间动归所需的状态数组加上状压应是3维,300*300=90000,如果以一般数组大小(个人理解是1000000~20000000)的话大约还能压100~200左右,那么就是256——2^8了,2^8有什么实际意义呢8就是k的最小值,我们就可以根据这个信息猜到可能是要去压8位。
  那么压8位的化状态数组就是f[301][301][1<<8]了,f[i][j][s]就表示从i到j之间进行字符串替换后成为s的状态所能得到的最大值,转移也就成为了区间动归套路,首先第一层循环一定是枚举区间长度,用小区间去维护大区间,第二层就是枚举左端点了,第三层也就是枚举中间值,由于还有状压,第四层就是枚举状态了,由于我们每次合并都是以k为长度,所以右端点不必挨个枚举,每次减去k-1即可。
  然后如果len=k-1,说明该串可以被合并,我们就去找每个合法状态中转化为0或1中最大的两个,由于最终只能变化为0或1,这样无疑是正确的,然后,统计一下最优答案就好了。
  
 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
int n,k;
long long b[<<],c[<<];
long long f[][][<<];
char a[];
int main(){
// freopen("merge.in","r",stdin);
// freopen("merge.out","w",stdout);
memset(f,-0x7f,sizeof(f));
scanf("%d%d",&n,&k);
scanf("%s",a);
for(int i=;i<=n;i++)
{
f[i][i][a[i-]-'']=;
}
for(int i=;i<(<<k);i++)
{
scanf("%lld%lld",&b[i],&c[i]);
}
for(int l=;l<=n;l++)
{
for(int i=;i<=n-l+;i++)
{
int j=i+l-;
int len=j-i;
while(len>=k){
len-=k-;
}
for(int t=j;t>i;t-=k-)
{
for(int s=;s<(<<(len));s++)
{
if(f[i][t-][s]!=f[][][]&&f[t][j][]!=f[][][])
{
f[i][j][s<<]=max(f[i][j][s<<],f[i][t-][s]+f[t][j][]);
}
if(f[i][t-][s]!=f[][][]&&f[t][j][]!=f[][][])
{
f[i][j][s<<|]=max(f[i][j][s<<|],f[i][t-][s]+f[t][j][]);
}
}
}
if(len==k-)
{
long long g[];
g[]=g[]=f[][][];
for(int s=;s<(<<k);s++)
{
if(f[i][j][s]!=f[][][])
{
g[b[s]]=max(g[b[s]],f[i][j][s]+c[s]);
}
}
f[i][j][]=g[];
f[i][j][]=g[];
}
}
}
long long ans=f[][][];
for(int i=;i<(<<k);i++)
{
ans=max(ans,f[][n][i]);
}
printf("%lld\n",ans);
//while(1);
return ;
}

 

[Haoi2016]字符合并 题解的更多相关文章

  1. 【BZOJ】4565: [Haoi2016]字符合并

    4565: [Haoi2016]字符合并 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 690  Solved: 316[Submit][Status ...

  2. 题解 [HAOI2016]字符合并

    题目传送门 Description 有一个长度为 \(n\) 的 \(01\) 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数. 得到的新字符和分数由这 k 个字符确定.你需要 ...

  3. BZOJ4565 [Haoi2016]字符合并

    题意 有一个长度为\(n\)的\(01\)串,你可以每次将相邻的\(k\)个字符合并,得到一个新的字符并获得一定分数.得到的新字符和分数由这\(k\)个字符确定.你需要求出你能获得的最大分数. \(n ...

  4. 【BZOJ4565】 [Haoi2016]字符合并

    Description 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字 符和分数由这 k 个字符确定.你需要求出你能获得的最大分数. I ...

  5. BZOJ4565 HAOI2016字符合并(区间dp+状压dp)

    设f[i][j][k]为将i~j的字符最终合并成k的答案.转移时只考虑最后一个字符是由哪段后缀合成的.如果最后合成为一个字符特殊转移一下. 复杂度看起来是O(n32k),实际常数极小达到O(玄学). ...

  6. 2018.10.25 bzoj4565: [Haoi2016]字符合并(区间dp+状压)

    传送门 当看到那个k≤8k\le 8k≤8的时候就知道需要状压了. 状态定义:f[i][j][k]f[i][j][k]f[i][j][k]表示区间[i,j][i,j][i,j]处理完之后的状态为kkk ...

  7. [BZOJ4565][HAOI2016]字符合并(区间状压DP)

    https://blog.csdn.net/xyz32768/article/details/81591955 首先区间DP和状压DP是比较明显的,设f[L][R][S]为将[L,R]这一段独立操作最 ...

  8. 【BZOJ 4565】 [Haoi2016]字符合并 区间dp+状压

    考试的时候由于总是搞这道题导致爆零~~~~~(神™倒序难度.....) 考试的时候想着想着想用状压,但是觉得不行又想用区间dp,然而正解是状压着搞区间,这充分说明了一件事,状压不是只是一种dp而是一种 ...

  9. [HAOI2016]字符合并

    Luogu3736 很容易想到直接DP,关键是枚举顺序. \(1.\)设后一段构成最后一个点,前一段构成前面的点,那么能得到\(1\)个点的数量要求 : \(1,k,2k-1...\)相差\(k-1\ ...

随机推荐

  1. uwp 获取系统字体库

    原文:uwp 获取系统字体库 效果图: 要获取到字体库首先要在 NuGet 添加 SharpDx.Direct2D1  api: /// <summary> /// 获取系统字体库列表 / ...

  2. VS2008发布项目“发布失败”,没有提示错误

    VS2008发布项目时发布失败,但是没有提示任何的错误. 解决方法: 组合键”Ctrl+Alt+O”; 根据这个我知道了,是因为我更改了文件名,发布时找不到导致的,然后在资源管理器中找到那一项,删除或 ...

  3. 动态加载XAML

    string FadeInStoryBoard = "<StoryBoard ... />"; StoryBoard storyBoard = XamlReader.L ...

  4. 改善C#程序的建议7:正确停止线程

    原文:改善C#程序的建议7:正确停止线程 开发者总尝试对自己的代码有更多的控制.“让那个还在工作的线程马上停止下来”就是诸多要求中的一种.然而事与愿违,这里面至少存在两个问题: 第一个问题是:正如线程 ...

  5. 利用BLCR加速android的启动(android4.2)

    BOSS要求提高安卓系统的启动速度,优化bootloader和kernel后,发现还是达不到要求,没办法才打起zygote的注意. ================================== ...

  6. Qt在Mac OS X下的编程环境搭建(配置Qt库和编译器,有图,很清楚)

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要 ...

  7. 【MyEclipse常见错误】-java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决

    ApacheJavaTomcatMyeclipse  自己前一段时间出现了这个问题,通过在网上搜索,大概知道了原因,整理下一,以供大家参考. 将项目部署好后,启动tomcat后报错,java.lang ...

  8. 快速开发平台 WebBuilder 8.6发布

    WebBuilder下载:http://www.geejing.com/download.html WebBuilder快速开发平台是基于Web面向服务的应用系统开发平台,可以方便快捷的搭建各类型企业 ...

  9. Ruby元编程:动态添加类属性及其实际应用

    上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...

  10. Ubuntu 下压缩软件的安装

    在ubuntu下,系统就自带一个压缩包管理软件,但是,它默认是不支持rar和7zip格式的.因此,我们可以给它直接“增强”一下.就成了万能的了.安装方法,终端里面: sudo apt-get inst ...