写了几道状压。。。然后就一直在颓废。。。

2064: 分裂

http://www.lydsy.com/JudgeOnline/problem.php?id=2064

初始的为正,最后的为负,假设我们能找到k组凑成0的话,答案就是n+m-2*k。于是状压。。其实我一点都不会。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define maxn 1<<22
using namespace std;
int t,mm,f[maxn],sum[maxn],ans,n,m,a[],b[];
int main(){
scanf("%d",&n);
rep(i,,n-) scanf("%d",&a[i]);
scanf("%d",&m);
rep(i,,m-) scanf("%d",&b[i]);
rep(i,,n-) sum[<<i]=a[i];
rep(i,n,n+m-) sum[<<i]=-b[i-n];
mm=<<(n+m);
rep(i,,mm-){
t=i&(-i);
sum[i]=sum[t]+sum[i-t];
rep(j,,m+n-)
if ((<<j)&i) f[i]=max(f[i],f[i^(<<j)]);
if (!sum[i]) ++f[i];
}
printf("%d\n",n+m-*f[mm-]);
return ;
}
1725: [Usaco2006 Nov]Corn Fields牧场的安排
http://www.lydsy.com/JudgeOnline/problem.php?id=1725
f[i][j]表示第i行,情况是j的答案。于是裸状压。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define maxn 5000
#define mm 100000000
int y,sum,tot,ans,ff[][maxn],f[][maxn],g[][maxn],d[maxn],map[][],n,m;
using namespace std;
void dfs(int x){
if (x>m) {
d[y]=++tot;
g[y][tot]=sum;
ff[y][tot]=ans;
return;
}
if (map[y][x]==){
sum+=(<<(x-));
ans++;
dfs(x+);
sum-=(<<(x-));
ans--;
}
dfs(x+);
}
int main(){
scanf("%d%d",&n,&m);
rep(i,,n)
rep(j,,m) scanf("%d",&map[i][j]);
rep(i,,n){
tot=ans=sum=;
y=i;
dfs();
}
ans=;
if (n==) printf("%d\n",d[]);
else {
rep(i,,d[]) f[][i]=;
rep(i,,n)
rep(j,,d[i])
rep(k,,d[i-]){
if ((g[i][j]&g[i-][k])==) f[i][j]=(f[i][j]+f[i-][k])%mm;
}
rep(i,,d[n]) ans=(ans+f[n][i])%mm;
printf("%d",ans);
}
return ;
}
1231: [Usaco2008 Nov]mixup2 混乱的奶牛
http://www.lydsy.com/JudgeOnline/problem.php?id=1231
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define ll long long
#define maxn 70000
ll f[maxn][],mm,ans;
int n,m,a[];
int main(){
scanf("%d%d",&n,&m);
rep(i,,n) scanf("%d",&a[i]);
rep(i,,n-) f[<<i][i+]=;
mm=(<<n)-;
rep(i,,mm)
rep(j,,n) if (<<(j-)&i)
rep(k,,n) if ((<<(k-)|i)!=i&&abs(a[k]-a[j])>m) f[i|<<(k-)][k]+=f[i][j];
rep(i,,n) ans+=f[mm][i];
printf("%lld\n",ans);
return ;
}
2073: [POI2004]PRZ
http://www.lydsy.com/JudgeOnline/problem.php?id=2073
主要就是枚举子集转移的时候比较神奇。其实也没什么。。。
(这个比较神奇是这样的,每次&(j-1)可以发现每次去掉了原二进制数中最后一个1,也就是砍掉了这个人。这样的好处在于保证正确性然后。。因为答案是多个集合的答案加起来,如果我从头枚举转移的子集,那时间复杂度是不允许的,但是用上面那种方式转移的话,转移的时间复杂度就只有n*2^n
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define ll long long
#define maxn 70000
using namespace std;
int mm,n,m,a[],b[],t[],w[maxn],tim[maxn],f[maxn];
int main(){
scanf("%d%d",&m,&n);
rep(i,,n) scanf("%d%d",&a[i],&b[i]),t[i]=<<(i-);
mm=(<<n)-;
rep(i,,mm)
rep(j,,n) if (t[j]&i) tim[i]=max(tim[i],a[j]),w[i]+=b[j];
memset(f,/,sizeof(f)); f[]=;
rep(i,,mm)
for(int j=i;j;j=i&(j-))
if (w[j]<=m) f[i]=min(f[i],tim[j]+f[i^j]);
printf("%d\n",f[mm]);
return ;
}
 

状压dp初探的更多相关文章

  1. 状压DP初探·总结

    2018过农历新年这几天,学了一下状态压缩动态规划,现在先总结一下.   状态压缩其实是一种并没有改变dp本质的优化方法,阶段还是要照分,状态还是老样子,决策依旧要做,转移方程还是得列,最优还是最优, ...

  2. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  3. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  4. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  5. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  6. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  7. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  8. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  9. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

随机推荐

  1. bzoj 2302: [HAOI2011]Problem c

    Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了, ...

  2. iOS音频采集过程中的音效实现

    1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...

  3. ASP.NET Core文件上传与下载(多种上传方式)

    前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经 ...

  4. 阿里云Centos7 apache配置

    其实很简单,主要是有坑. 首先填坑,在阿里云安全策略上开放要访问的端口,然后配置firewall添加对应端口开放. firewall-cmd --zone=public --add-port=8011 ...

  5. 最短的IE判断var ie=!-[1,]分析

    以前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的. 复制代码代码如下:  var ie = !+"\v1";  仅仅需要7bytes!参见这篇文章,<32 byte ...

  6. Spring3.x企业开发应用实战读书笔记 —— 第三章IoC容器概述

    声明:    本篇博客绝大多数内容为<Spring3.x企业开发应用实战>一书原内容,所有版权归原书作者所有!,仅供学习参考,勿作他用! 3.2 相关Java基础知识 Java语言允许通过 ...

  7. ASP.NET MVC 5使用Swagger生成API文档

    一.安装 新建一个没有身份验证的mvc项目 - SwaggerMvc5Demo,然后添加一个名为Remote(自定义)且包含基础读写(不想手写)的ApiController   开源地址:https: ...

  8. JS输出26个英文大小写字母

    JS中可以利用ASCII值 for(var i=0;i<26;i++){ console.log(String.fromCharCode(65+i));//输出A-Z 26个大写字母 } for ...

  9. MicroPython-GPS教程之TPYBoardv702控制5110显示当前经纬度

    一.关于TPYBoardV702 TPYBoardV702是目前市面上唯一支持通信定位功能的MicroPython开发板:支持Python3.0及以上版本直接运行.支持GPS+北斗双模定位.GPRS通 ...

  10. 通过ArcMap发布服务

    打开ArcMap,添加一个空地图 单击添加数据按钮 单击之后出现下图 点击 (连接到文件夹)按钮选择要添加的文件.添加之后如下. 保存为mxd文件 点击保存按钮就可以保存为mxd格式文件. 选择 Fi ...