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

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. [数据结构]C语言二叉树的实现

    树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面 首先我们要把树进行分类: &g ...

  2. c语言库函数测试

    1.函数名: abort功  能: 异常终止一个进程用  法: void abort(void);程序例: #include <stdio.h> #include <stdlib.h ...

  3. 在Ubuntu14.04下安装 labelImg (标数据用)

    安装 SIP 下载 SIP 并解压 : $ sudo python configure.py $ make $ sudo make install 安装 依赖库 $  sudo apt-get ins ...

  4. bzoj 4898: [Apio2017]商旅

    Description 在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴.你被这个城市发达而美丽的市场所 深深吸引,决定定居于此,做一个商人.科巴有个集市,集市用从1到N的整数编号 ...

  5. calling c++ from golang with swig--windows dll (三)

    calling c++ from golang with swig--windows dll 三 使用动态链接库(DLL)主要有两种方式:一种通过链接导入库,在代码中直接调用DLL中的函数:另一种借助 ...

  6. 基于Vue+node.js的个人博客

    前言 作为一个年轻的程序员,而且是作为一个未来的前端工程师,怎么能没有一个属于自己的博客呢,于是乎在暑假咸鱼了一个多月后开始了我的博客的编写. 技术栈 前端 vue.js+scss  因为当时没学vu ...

  7. 关于Oracle开启自动收集统计信息的SPA测试

    主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息的收 ...

  8. [Redis源码阅读]dict字典的实现

    dict的用途 dict是一种用于保存键值对的抽象数据结构,在redis中使用非常广泛,比如数据库.哈希结构的底层. 当执行下面这个命令: > set msg "hello" ...

  9. SpringMVC 如何在页面中获取到ModelAndView绑定的值

    springMVC中通过ModelAndView进行后台与页面的数据交互,那么如何在页面中获取ModelAndView绑定的值呢? 1.在JSP中通过EL表达式进行获取(比较常用) 后台:ModelA ...

  10. 最新swift4.0 图片进行尺寸大小及体积压缩

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Menlo; color: #4dbf56; background-color: #282b3 ...