Sunshine’s string(merge.cpp)

【问题描述】

无聊的Sunshine大爷开始研究字符串。他找来了一个长度为n的01字符串,并制定了一些规则:每次可以将k个字符合并,得到一个新的字符并获得一定的分数。追求完美的宇宙金牌爷想知道他最多能获得多少分数。

【输入格式】

第一行两个整数n和k,分别表示字符串的长度和每次合并的长度。

第二行n个0或1的字符。

接下来2^k行,第i行表示长度为k的01串连成二进制后按从小到大顺序得到的第i种合并方案得到的新字符和对应的第i种方案对应获得的分数。

【输出格式】

一个整数表示能获得的最大分数。

【样例输入】

3 2

1 0 1

1 10

1 10

0 20

1 30

【样例输出】

40

【数据规模及约定】

————————————————————————————————————————————

【题解】【状压dp】

【发现k比较小,考虑状压
记f[i][j][S]表示把i~j这一段消除成S这个状态能获得的最大分数,转移的时候只考虑将右边的一段消到只有一个字符,然后加到左边去。并且f[i][j][S]可以直接转移到f[i][j][c[S]]。
复杂度O(n^3*2^k)
看起来复杂度很高但是可以发现转移其实很少】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll f[310][310][1<<8];
int c[1<<8],w[1<<8],a[310],n,k;
int main()
{freopen("merge.in","r",stdin);freopen("merge.out","w",stdout);int i,j;scanf("%d%d",&n,&k);for(i=1;i<=n;++i) scanf("%d",&a[i]);for(i=0;i<(1<<k);++i) scanf("%d%d",&c[i],&w[i]);memset(f,128,sizeof(f));ll INF=f[0][0][0];for(i=n;i;--i)for(j=i;j<=n;++j){if(i==j) {f[i][j][a[i]]=0; continue;}int len=j-i;  ll t,now;while(len>=k) len-=k-1;for(int l=j;l>i;l-=k-1)for(int h=(1<<len)-1;~h;h--)if((now=f[i][l-1][h])!=INF){if((t=f[l][j][0])!=INF) f[i][j][h<<1]=max(f[i][j][h<<1],t+now);if((t=f[l][j][1])!=INF) f[i][j][h<<1|1]=max(f[i][j][h<<1|1],t+now);}if(len==k-1){ll g[2]; g[0]=g[1]=INF;for(int h=(1<<k)-1;~h;h--)if(f[i][j][h]!=INF) g[c[h]]=max(g[c[h]],f[i][j][h]+w[h]);f[i][j][0]=g[0]; f[i][j][1]=g[1];  }}ll ans=0;for(i=(1<<k)-1;~i;--i) ans=max(ans,f[1][n][i]);printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/lris-searching/p/9403119.html

【校内互测】Sunshine’s string(merge) (状压dp)相关推荐

  1. 校内互测 B. 王者荣耀 (二分答案+dp)

    B. 王者荣耀 时间限制:1s 内存限制:128MB 问题描述 从未来回来后,他知道他最近要打 n 局王者荣耀,其中第 i 局需要耗时li,并且这个顺序在时间上是不可改变的.作为一个很(mei)有自制 ...

  2. FZU - 2218 Simple String Problem(状压dp)

    题目链接:点击查看 题目大意:给出一个长度为n,含有k个不同字母的字符串,我们的任务是从中挑选出两段连续的子串,要求其长度的乘积最大,还有一个限制条件是,这两个子串不能互相包含相同的字母 题目分析:因 ...

  3. 【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd

    这题是hdu 4114... 跟着19的打了打周测,发现个好题 写了写还wa了一发 题目大意: 给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果 ...

  4. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  5. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  6. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  7. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  8. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

  9. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

最新文章

  1. GDCM:gdcm::Rescaler的测试程序
  2. JS+HTML画图的几种方法
  3. 数组初始化使用(写)new与不使用(不写)new
  4. 小学有学计算机课程,如何进行小学计算机课程有效教学.doc
  5. Qt关于Tcp通信步骤的总结
  6. 如何使用Aimersoft iMusic for Mac从 Android 手机备份歌曲到 PC/Mac?
  7. WPF框架MVVM简单例子
  8. void类型及void指针
  9. Java多线程学习笔记(三)——Future和FutureTask
  10. spring创建定时任务
  11. Intellij IDEA 2019 最新优化配置
  12. 江苏农村商业银行计算机类笔试考什么时候,2020江苏农商行笔试考试内容是什么?...
  13. Linux 命令(142)—— hexdump 命令
  14. 网络安全之交换技术篇
  15. 宝塔面板搭建个人图床Chevereto完整教程
  16. rk3568 LTE(EC20--GPS)
  17. 新唐单片机keil驱动问题
  18. crm客户管理系统的功能有哪些?
  19. 说话人识别相关基础知识整理(持续更新)
  20. Squid访问控制实例

热门文章

  1. Hibernate学习之createSQLQuery与createQuery的区别及使用
  2. Js 与 as 相互通信
  3. C++ Qt学习笔记(2)简易计算器设计(为计算器添加菜单功能)
  4. python 深浅拷贝案例_python(深浅拷贝)
  5. Zabbix(三)zabbix平台添加服务监控选项(http、nginx、mysql)
  6. WebStorm设置自动刷新
  7. 春眠不觉晓,读书醒醒脑|世界读书日送书征集
  8. 区块链学者Michael Goldstein:比特币可以防止能源浪费
  9. Coinbase发生一笔7500枚BTC巨额转出交易 转移金额近2.5亿美元
  10. SAP License:SAP权限原理与授权对象