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

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. kvm 随笔

    1. 查看kvm虚拟机状态 # virsh list --all   2. KVM虚拟机开机 # virsh start windows   3. KVM虚拟机关机或断电 (1) 关机 virsh关机 ...

  2. lua 实现tableToString

    function tableToString(studentNum) local str = "{ " str = str.."\n" for k, v in ...

  3. 文件上传之伪Ajax方式上传

    From: <由 Windows Internet Explorer 8 保存> Subject: =?gb2312?B?zsS8/snPtKvWrs6xQWpheLe9yr3Jz7SrI ...

  4. Java基础--二进制运算

    1. System.out.println((byte)0x8f); 结果是? 2.System.out.println((byte)(0xc5>>1)); 结果是? 3.System.o ...

  5. weex Mac开发环境

    安装: 1.java的jdk下载和安装 1-1.下载.安装:省略 1-2.配置 第一步:命令行内输入touch .bash_profile命令,生成.bash_profile的隐藏配置文件,用于配置j ...

  6. 正则验证,match()与test()函数的区别?

    test是RegExp的方法,参数是字符串,返回值是boolean类型.match是String的方法,参数是正则表达式,返回值是数组. 案例: //判断日期类型是否为YYYY-MM-DD格式的类型 ...

  7. js设置元素class方法小结及classList相关

        给DOM元素设置class是我们在项目中非常容易遇到的,网上的资料和总结也比较多,下面比较全面的整理一下,希望给到大家一些帮助!并引用两种成熟的classList的兼容方法 一.el.setA ...

  8. IndentationError: unexpected indent

    都知道python是对格式要求很严格的,写了一些python但是也没发现他严格在哪里,今天遇到了IndentationError: unexpected indent错误我才知道他是多么的严格.    ...

  9. 一个简单JDK动态代理的实例

    动态代理的步骤: 创建一个实现了InvocationHandler接口的类,必须重写接口里的invoke()方法. 创建被代理的类和接口 通过Proxy的静态方法 newProxyInsatance( ...

  10. HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

    HTML5 Audio/Video 标签,属性,方法,事件   <audio> 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放contro ...