状态压缩-动态规划

Posted xjack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了状态压缩-动态规划相关的知识,希望对你有一定的参考价值。

状态压缩-动态规划

---By蒟蒻鱼

用二进制表示城市的到达(规划的)状态
每一个二进制数都代表一个唯一的十进制数


预备知识

  • 位运算

优先级

~
<< 和 >>
&
^
|

按位与 & 全一则一,否则为零

按位或 | 有一则一,否则为零

按位取反 ~ 是零则一,是一为零

按位异或 ^ 不同则一,相同为零

移位 >> <<


基本运算:

集合取并 A|B

集合取交 A&B

集合相减 A&~B

集合相减 ALLBITS~A

置位 A|1<<bit

清位 A^(1<<bit)


TSP问题

dp[i][j]代表已经走过城市的方案为i,当前所在j号城市的最短路径的长度
DP方程:
dp[i][j]=min(dp[i^(1<<j-1)][k]+dis[k][j])
i^(1<<j-1)清除j的前驱

合法布阵问题

corn fields

玉米田
时间限制:2000毫秒内存限制:65536K
提交总数:21933接受:11472
描述

农场主约翰购买了一个郁郁葱葱的新矩形牧场,由m×n(1≤m≤12;1≤n≤12)个方形地块组成。他想在一些广场上为奶牛种些好吃的玉米。遗憾的是,有些广场是不孕的,不能种植。Canny FJ知道奶牛不喜欢互相靠近吃东西,所以在选择种植哪种方块时,他避免选择相邻的方块;没有两个选择的方块共用一个边。他还没有最终决定种植哪种方块。

作为一个非常开明的人,农夫约翰想考虑所有可能的选择,如何选择广场种植。他是如此的开明,他认为选择没有广场是一个有效的选择!请帮助农夫约翰确定他可以选择种植方块的方法的数量。

输入

第1行:两个空格分隔的整数:m和n
第2.m+1行:第i+1行描述牧场的第一行,用N个空格分隔的整数表示一个正方形是否可育(1表示可育,0表示不可育)
产量

第1行:一个整数:FJ选择平方模10000000的方法数。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int mod=100000000;

int n,m;
int st[1<<12],map[1<<12];//分别表示每一行的状态和草地的状态
int dp[15][1<<12]; 

int main()
{
    scanf("%d%d",&n,&m);
    int x;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&x);
            if(x==0)map[i]=map[i]|(1<<j-1);
        }
    int k=0;
    for(int i=0;i<(1<<m);i++)//计算每行合法的放置方式 
    {
        if(!(i&(i<<1)))st[++k]=i;
    }
    for(int i=1;i<=k;i++)//特判第一行 
    {
        if(!(st[i]&map[1]))dp[1][i]=1;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if(!(map[i]&st[j]))for(int r=1;r<=k;r++)
            {
                if(!(map[i-1]&st[r]))
                {
                    if(!(st[j]&st[r]))dp[i][j]+=dp[i-1][r];
                }
            } 
        }
    }
    int ans=0;
    for(int i=1;i<=k;i++)
    
    {
        ans=(ans+dp[n][i])%mod;
    }
    printf("%d",ans);
    return 0;
}

end

以上是关于状态压缩-动态规划的主要内容,如果未能解决你的问题,请参考以下文章

对使用状态压缩和动态规划求hamilton最短路径的理解

对使用状态压缩和动态规划求hamilton最短路径的理解

对使用状态压缩和动态规划求hamilton最短路径的理解

dp状态压缩

动态规划——用二进制表示集合的状态压缩DP

状态压缩-动态规划