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][j][0]),$
$f[i][j][S<<1|1]=max(f[i][j][S<<1|1],f[i][m-1][S]+f[m][j][1]);$
为了区分001 01 和1
更新的时候要新开一个数组记录 最后再更新
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
int n,k,f[][][],g[],ans,c[],w[];
char s[];
signed main(){
scanf("%lld%lld",&n,&k);
scanf("%s",s+);
for(int i=;i<(<<k);i++)scanf("%lld%lld",&c[i],&w[i]);
memset(f,0xcf,sizeof(f));
for(int i=;i<=n;i++)s[i]-='',f[i][i][s[i]]=;
for(int l=;l<=n;l++)
for(int i=;i<=n-l+;i++){
int j=i+l-,len=j-i;
while(len>=k)len-=k-;
for(int m=j;m>i;m-=k-)
for(int S=;S<(<<len);S++)
f[i][j][S<<]=max(f[i][j][S<<],f[i][m-][S]+f[m][j][]),
f[i][j][S<<|]=max(f[i][j][S<<|],f[i][m-][S]+f[m][j][]);
if(len==k-){
g[]=g[]=-100000000000000ll;
for(int S=;S<(<<k);S++)
g[c[S]]=max(g[c[S]],f[i][j][S]+w[S]);
f[i][j][]=g[],f[i][j][]=g[];
}
}
for(int i=;i<(<<k);i++)ans=max(ans,f[][n][i]);
printf("%lld\n",ans);
}
BZOJ 4565 状压DP的更多相关文章
- 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 4565 状压区间dp
我还以为我状压很好...... 噗!!! 果然我区间很差... f[i][j][s]表示i~j段,合并后的状态为s所得的最大收益 枚举i,j,k,s. f[i][j][s<<1]=max( ...
- BZOJ 2064 - 状压DP
传送门 题目大意: 给两个数组, 数组中的两个元素可以合并成两元素之和,每个元素都可以分裂成相应的大小,问从数组1变化到数组2至少需要多少步? 题目分析: 看到数据范围\(n<=10\), 显然 ...
- BZOJ 4057 状压DP
思路: 状压一下 就完了... f[i]表示选了的集合为i 转移的时候判一判就好了.. //By SiriusRen #include <cstdio> #include <cstr ...
- bzoj 1072状压DP
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 1448[Submit][St ...
- bzoj 1072 状压DP
我们用w[i][j]来表示,i是一个二进制表示我们选取了s中的某些位,j表示这些位%d为j,w[i][j]则表示这样情况下的方案数,那么我们可以得到转移.w[i|(1<<k)][(j*10 ...
- bzoj 2669 状压DP
因为最多有8个'X',所以我们可以用w[i][s]来表示现在我们填了前i个数,填的X的为S,因为每次新加进来的数都不影响前面的最小值,所以我们可以随便添加,这样就有了剩下所有位置的方案,每次都这样转移 ...
- bzoj 1076 状压DP
我们设w[i][s]为当前到第i关,手中的物品为s的时候,期望得分为多少,其中s为二进制表示每种物品是否存在. 那么就比较容易转移了w[i][s]=(w[i-1][s']+v[j]) *(1/k),其 ...
随机推荐
- mstsc windows7/10远程桌面身份验证错误 要求的函数不受支持
之前好好的能远程桌面连接到服务器,但是今天来就不能连接上了,并提示:身份验证错误.要求的函数不受支持. 猜想可能是Windows又更新了什么鬼,后面查询资料知道是由于CredSSP加密Oracle修正 ...
- PHP控制反转(IOC)和依赖注入(DI
<?php class A { public $b; public $c; public function A() { //TODO } public function Method() { $ ...
- @FunctionalInterface
>> 函数式接口也称为SAM接口 Single Abstract Method interfaces 接口有且仅有一个抽象方法 允许定义静态方法 允许定义默认方法 允许java.lang. ...
- 刽子手游戏(Hangman Judge, UVa 489)
刽子手游戏其实是一款猜单词游戏,游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母.如果单词里有那个字母,所有该字母会显示出来:如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔.这幅 ...
- shell 读取目录指定文件并截取拼接
shell脚本读取指定文件并拼接成指定的版本信息
- MINSUB - Largest Submatrix
MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative integers) a ...
- poj 1724 最短路+优先队列(两个约束条件)
/*两个约束条件求最短路,用优先队列*/ #include<stdio.h> #include<string.h> #include<queue> using na ...
- hdu 1273最大流
#include<stdio.h> #include<string.h> #define inf 1000000000 #include<queue> #defin ...
- 超经典SQL练习题,做完这些你的SQL就过关了
使用方法:我用的数据库是 Ms SQL Server 2008 ,练习时应当自己建数据,自己先思考,切勿急躁翻答案!否则效果减半,做完这些,恭喜你,你的 SQL 就算过关了. 测试表格 --1.学生表 ...
- 如何拿CSDN博客上的原图
比如带水印的地址: http://img.blog.csdn.net/20140408122234546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdT ...