【一天一DP计划】状压DP

##P1896 互不侵犯【状压dp】

  • 用01串表示每一行的可行解
  • 列与列之间的限制条件在转移的时候continue
  • x&=(-x)可以找到x的二进制位上有多少个1
  • 关于位运算的优先级!不确定就无脑加括号哦哦
reference:
    https://www.luogu.org/blog/virus2017/1896dnqec
Date:
    2019.10.04
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dwn(i,a,b) for(int i=a;i>=b;--i)
template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;}
#define mem(a,b) memset(a,b,sizeof(a))

int f[9+5][512+5][81+5];
//f[i][j][k]表示第i行的状态选的是第j个状态,有k个国王的方案数
//上个状态:f[i-1][jj][k-cnt[j]];
int n,K,tot;
int st[512+5],cnt[512+5];
//st表示当前可行的状态(01串
//cnt表示st[]的状态有多少个1(为了后面利用背包的思想转移) 

inline void get_num(int x){
    int now=0;
    while(x){
        x&=(x-1);
        now++;
    }
    cnt[tot]=now;
}

inline void pre_work(){
    for(int i=0;i<(1<<n);++i)
        if(!(i&(i<<1)))//遇到位运算最好加括号,比如不能写成i&(-i)==0(==优先级比&高)
            st[++tot]=i,get_num(i);
}

#undef int
int main(){
#define int long long
    #ifdef WIN64
    freopen("qinfan.txt","r",stdin);
    #endif
    rd(n),rd(K);
    pre_work();
    rep(i,1,tot)f[1][i][cnt[i]]=1;
    rep(i,2,n)
        rep(j,1,tot)
            rep(jj,1,tot){
                if(st[j]&st[jj] || (st[j]<<1)&st[jj] || (st[j]>>1)&st[jj])continue;
                dwn(k,K,cnt[j])
                    f[i][j][k]+=f[i-1][jj][k-cnt[j]];
            }
    int ans=0;
    rep(i,1,tot)
        ans+=f[n][i][K];
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634651.html

时间: 2024-08-29 23:39:34

【一天一DP计划】状压DP的相关文章

dp乱写2:状态压缩dp(状压dp)炮兵阵地

https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能够攻击到但是不能摆放 求最多能摆放的炮兵的数量 就是这个意思. 难度提高,弱省省选 一开始是想写dfs(迷之八皇后)的, 但是看到数据量100就想dp了: 因为题目n的范围给的很少n<=10,想到状压 非常明显是一个状态压缩的dp(状压dp) 其实可以当做状压的入门题目来做. 由于本行的状态是由前若

[DP总结]状压DP

顾名思义,是用将状态进行二进制压缩成集合的形式来方便DP转移的方法. 一些常用的代码表示如下 i & j //取状态i,j重合部分 i ^ j //取状态i,j不同部分 i | j //合并状态i,j (1 << N) - 1 //表示111-1(N个1) 1 << i - 1 //表示00100-0(1后面有i-1个0,也就是有且仅有二进制下第i位为1) for (int i = 0; i < n; ++ i) if (x & (1 << i))

hoj 2662 经典状压dp // MyFirst 状压dp

题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. 但是有这样的一类题目,它们具有dp问题的特性,但状态中所包含的信息过多,如果要用数组来保存状态的话需要四维以上的数组. 于是,就要通过状态压缩来保存状态,而使用状态压缩来保存状态的dp就叫做状态压缩dp. 2.状态压缩dp的特点:状态中的某一维会比较小,一般不会超过15,多了的话状态数会急剧上升而无

codevs2596 售货员的难题(状压dp)

2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短.请你帮他选择一条最短的路. 输入描述 Input D

poj3254 Corn Fields (状压DP)

http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7588   Accepted: 4050 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parc

ZOJ3305Get Sauce 状压DP,

状压DP的题目留个纪念,首先题意一开始读错了,搞了好久,然后弄好了,觉得DFS可以,最后超时,修改了很久还是超时,没办法看了一下n的范围,然后觉得状压可以,但是没有直接推出来,就记忆化搜索了一下,可是一直错,莫名奇妙,然后没办法看了一下题解,发现了下面这个比较好的方法,然后按照这个方程去推,然后敲,也是WA了好多把,写的太搓了,没人家的清楚明了,唉~也算是给自己留个纪念,状压一直做的都不太好~唉~还好理解了, 参考了  http://blog.csdn.net/nash142857/articl

poj 2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12232   Accepted: 7142 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

HDU5816 Hearthstone(状压DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collectible card game from Blizzard Entertainment. Strategies and luck are the most important factors in this game. When you suffer a desperate situation an