【校内互测】Sunshine’s string(merge) (状压dp)
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)相关推荐
- 校内互测 B. 王者荣耀 (二分答案+dp)
B. 王者荣耀 时间限制:1s 内存限制:128MB 问题描述 从未来回来后,他知道他最近要打 n 局王者荣耀,其中第 i 局需要耗时li,并且这个顺序在时间上是不可改变的.作为一个很(mei)有自制 ...
- FZU - 2218 Simple String Problem(状压dp)
题目链接:点击查看 题目大意:给出一个长度为n,含有k个不同字母的字符串,我们的任务是从中挑选出两段连续的子串,要求其长度的乘积最大,还有一个限制条件是,这两个子串不能互相包含相同的字母 题目分析:因 ...
- 【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd
这题是hdu 4114... 跟着19的打了打周测,发现个好题 写了写还wa了一发 题目大意: 给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- Codeforces Gym 100676G Training Camp 状压dp
http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...
- hdu 4739 状压DP
这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...
- CodeForces - 1550E Stringforces(二分+状压dp)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...
- 中石油训练赛 - Watch Later(状压dp)
题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...
最新文章
- GDCM:gdcm::Rescaler的测试程序
- JS+HTML画图的几种方法
- 数组初始化使用(写)new与不使用(不写)new
- 小学有学计算机课程,如何进行小学计算机课程有效教学.doc
- Qt关于Tcp通信步骤的总结
- 如何使用Aimersoft iMusic for Mac从 Android 手机备份歌曲到 PC/Mac?
- WPF框架MVVM简单例子
- void类型及void指针
- Java多线程学习笔记(三)——Future和FutureTask
- spring创建定时任务
- Intellij IDEA 2019 最新优化配置
- 江苏农村商业银行计算机类笔试考什么时候,2020江苏农商行笔试考试内容是什么?...
- Linux 命令(142)—— hexdump 命令
- 网络安全之交换技术篇
- 宝塔面板搭建个人图床Chevereto完整教程
- rk3568 LTE(EC20--GPS)
- 新唐单片机keil驱动问题
- crm客户管理系统的功能有哪些?
- 说话人识别相关基础知识整理(持续更新)
- Squid访问控制实例
热门文章
- Hibernate学习之createSQLQuery与createQuery的区别及使用
- Js 与 as 相互通信
- C++ Qt学习笔记(2)简易计算器设计(为计算器添加菜单功能)
- python 深浅拷贝案例_python(深浅拷贝)
- Zabbix(三)zabbix平台添加服务监控选项(http、nginx、mysql)
- WebStorm设置自动刷新
- 春眠不觉晓,读书醒醒脑|世界读书日送书征集
- 区块链学者Michael Goldstein:比特币可以防止能源浪费
- Coinbase发生一笔7500枚BTC巨额转出交易 转移金额近2.5亿美元
- SAP License:SAP权限原理与授权对象