状态压缩和状压DP

作者: lvanzn | 来源:发表于2018-09-20 20:33 被阅读0次

问题:n*n的棋盘放置n个点,保证每一行,每一列都有且只有一个点,有几种放置方式?

一、组合数解法:
ans=n!
二、状态压缩DP:

方案数目:f[0]=1,其他初始化为0

状态:10010=>21+24=2+16=18->一个整数表示一种状态->
拆解整数->表示了所有的部件的当前状态

遍历顺序(第一层):s:1 -> (1<<n-1)=>(111..11(n个位))
(第二层):i:1->n(枚举所有的部件)

已知当前的状态是s:

操作一:s&(1<<(n-1))

if(s&(1<<(n-1)))
{
操作二:s^(1<<(n-1)),这是根据s,找到的上一个的所有的状态
令tmp=s^(1<<(n-1))
f[s]+=f[tmp]//累加得出答案
}

神犇博客:
https://blog.csdn.net/soundwave_/article/details/52100038
(这里只讲我的具体理解)

具体代码:

#include <iostream>
#include <stdio.h>
using namespace std;
 int f[1<<21];
int main()
{
    int n, temp;
    int s, i;
    scanf("%d", &n);
    memset(f,0,sizeof(f));
    f[0] = 1;//边界条件
    for(s = 1; s <= (1<<n)-1; s++)
    { 
        for(i = 1; i <= n; i++)
            if(s & (1<<(i-1)))//排除掉第i行所有不能放置的位置之后的可放位置
            {
                temp = s ^ (1<<(i-1));//可以得到s状态的状态
                f[s] += f[temp];//s状态下的方案数
            }
    }
    printf("%d", f[(1<<n)-1]);
    return 0;
}

相关文章

  • 状态压缩和状压DP

    问题:n*n的棋盘放置n个点,保证每一行,每一列都有且只有一个点,有几种放置方式? 一、组合数解法:ans=n!二...

  • 状压DP

    最短Hamilton路径 原题链接[https://www.acwing.com/activity/content...

  • DP训练——状压DP

    状压DP BZOJ1087题意在的棋盘里面放个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以...

  • 状压DP系列

    几点注意: 1.数组下标从1开始比较方便 zoj Easy 2048 Again保存状态的时候是保存下降子序列的情...

  • LeetCode 状压dp

    5639. 完成所有工作的最短时间[https://leetcode-cn.com/problems/find-m...

  • 状态压缩dp、轮廓线、插头dp——从入门到不会

    题目清单 POJ1185 炮兵布阵(状态压缩dp) HDU1693 闭合线路统计(插头dp) POJ2411 平面...

  • POJ 3311 floyd+压状DP

    poj3311因为这道题 点N 不超过10 可以 把状态转化 为 二进制数,0表示没经过这个点,1表示经过这个点。...

  • 博弈论

    博弈DP POJ 1082: Calendar Game从最终状态向前dp即可。注意如下两点:1 需要保证前后的状...

  • 第6课:限幅器的使用方法

    压缩器用于声音调整,限幅器用于系统保护。Threshold:启动电平值或阈值Ratio:压缩比,设置压限器在启动状...

  • HDU-5816 状压DP [2016多校]

    桌面有N张A型牌,M张B型牌,目前玩家可抽一张牌(盲抽),若抽到A牌则可再抽两张,若抽到B牌,则可减少对方若干生命...

网友评论

    本文标题:状态压缩和状压DP

    本文链接:https://www.haomeiwen.com/subject/fzpwnftx.html