bzoj 4565 状压区间dp
我还以为我状压很好。。。。。。
噗!!!
果然我区间很差。。。
f[i][j][s]表示i~j段,合并后的状态为s所得的最大收益
枚举i,j,k,s.
f[i][j][s<<1]=max(f[i][j][s<<1],f[i][k−1][s]+f[k][j][0])
f[i][j][s<<1|1]=max(f[i][j][s<<1|1],f[i][k−1][s]+f[k][j][1])
就这样……
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 350
#define LL long long
char ch[N];
int n,m,nxt[N],a[N],bit[10];
LL val[N],ans,f[N][N][1<<8],maxn[2];
using namespace std;
int main()
{
bit[0]=1;for(int i=1;i<=9;i++)bit[i]=bit[i-1]<<1;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
ch[i]=getchar();
while(ch[i]!='0'&&ch[i]!='1')ch[i]=getchar();
a[i]=ch[i]-'0';
}
for(int i=0;i<bit[m];i++)
scanf("%d%lld",&nxt[i],&val[i]);
memset(f,-1,sizeof f);
for(int i=1;i<=n;i++)f[i][i][a[i]]=0;
for(int l=2;l<=n;l++){
for(int i=1;i<=n-l+1;i++){
int j=i+l-1,len=l;
while(len>=m)len-=m-1;
for(int k=j;k>i;k-=m-1){
for(int s=0;s<bit[len==1?m-1:len-1];s++){
if(f[i][k-1][s]!=-1){
if(f[k][j][0]!=-1)f[i][j][s<<1]=max(f[i][j][s<<1],f[i][k-1][s]+f[k][j][0]);
if(f[k][j][1]!=-1)f[i][j][s<<1|1]=max(f[i][j][s<<1|1],f[i][k-1][s]+f[k][j][1]);
}
}
}
if(len==1){
maxn[0]=maxn[1]=-1;
for(int s=0;s<bit[m];++s)
if(f[i][j][s]!=-1)
maxn[nxt[s]]=max(maxn[nxt[s]],f[i][j][s]+val[s]);
f[i][j][0]=maxn[0];f[i][j][1]=maxn[1];
}
}
}
for(int i=0;i<=bit[m-1];i++)ans=max(ans,f[1][n][i]);
printf("%lld\n",ans);
return 0;
}
bzoj 4565 状压区间dp的更多相关文章
- BZOJ 4565 状压DP
思路: f[i][j][S]表示从i到j压成S状态 j-m是k-1的倍数 $f[i][j][S<<1]=max(f[i][j][S<<1],f[i][m-1][S]+f[m][ ...
- bzoj 1879 状压dp
879: [Sdoi2009]Bill的挑战 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 852 Solved: 435[Submit][Status ...
- bzoj 1087 状压dp
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4130 Solved: 2390[Submit][ ...
- BZOJ 2064 - 状压DP
传送门 题目大意: 给两个数组, 数组中的两个元素可以合并成两元素之和,每个元素都可以分裂成相应的大小,问从数组1变化到数组2至少需要多少步? 题目分析: 看到数据范围\(n<=10\), 显然 ...
- BZOJ 4057 状压DP
思路: 状压一下 就完了... f[i]表示选了的集合为i 转移的时候判一判就好了.. //By SiriusRen #include <cstdio> #include <cstr ...
- 【10.26校内测试】【状压?DP】【最小生成树?搜索?】
Solution 据说正解DP30行??? 然后写了100行的状压DP?? 疯狂特判,一算极限时间复杂度过不了aaa!! 然而还是过了....QAQ 所以我定的状态是待转移的位置的前三位,用6位二进制 ...
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
- 【BZOJ3925】[ZJOI2015] 地震后的幻想乡(状压期望DP)
点此看题面 大致题意: 有\(n\)个点和\(m\)条边,每条边的权值是一个\(0\sim1\)的随机实数,要你用\(n-1\)条边将图联通,问这\(n-1\)条边中边权最大值的期望最小值. 提示 这 ...
- HDU - 4804 Campus Design(状压+轮廓线dp)
Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...
随机推荐
- wait和notify的理解与使用
1.对于wait()和notify()的理解 对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify() Wakes up a si ...
- Spring Boot 多模块与 Maven 私有仓库
前言 系统复杂了,抽离单一职责的模块几乎是必须的:若需维护多个项目,抽离公用包上传私有仓库管理也几乎是必须的.其优点无需赘述,以下将记录操作过程. 1. 多模块拆分 在.NET 中由于其统一性,实现上 ...
- Eclipse配置SpringBoot
从这一博客开始学习SpringBoot,今天学习Eclipse配置SpringBoot.Eclipse导入SpringBoot有两种方式,一种是在线一个是离线方式. 一.在线安装 点击Eclipse中 ...
- Oracle技术面试问题
这也许是你一直期待的文章,在关注这部分技术问题的同时,请务必阅读有关面试中有关个人的问题和解答.这里的回答并不是十分全面,这些问题可以通过多个 角度来进行解释,也许你不必在面试过程中给出完全详尽的答案 ...
- oracle超出打开游标的最大数的原因和解决方案
oracle超出打开游标的最大数的原因和解决方案 分类: Oracle相关2012-06-05 10:36 6362人阅读 评论(0) 收藏 举报 oracle数据库sqljavasessionsys ...
- Windows10上搭建Kinect 2 开发环境
因为Visual Studio 2017的应用最低只能面向windows10,而Kinect SDK 2.0的系统版本要求是windows 8,所以不得不下载Visual Studio 2013 co ...
- eclipse3.7+resin4.0集成配置小结
1.插件不要用improve公司的了,那个太老了.直接用resin官方的,用eclipse的help->install new software功能,地址用:http://www.caucho. ...
- Ocelot中文文档-流量控制
感谢@catcherwong 的文章激励我最终写出了这个文档 Ocelot支持上游的请求限制,以便您的下游服务不会过载. 此功能是由GitHub上的@geffzhang添加! 非常感谢. 好了,为了让 ...
- 双网卡+mitmproxy+iptables搭建SSL中间人(支持非HTTPS协议)
"想要解决一个问题,最根本方法的就是了解这一切是如何工作的,而不是玄学." --ASCII0X03 最近学习发现现在很多现成的安卓SSL中间人工具和教程都只针对HTTPS流量,比如 ...
- python new和init知识点
__new__ 方法是什么?如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句 ...