首页 > 其他分享 >#2153. 「SCOI2005」互不侵犯(状压DP)

#2153. 「SCOI2005」互不侵犯(状压DP)

时间:2022-12-27 17:11:59浏览次数:68  
标签:状态 互不侵犯 int 状压 放置 2153 SCOI2005 DP

#2153. 「SCOI2005」互不侵犯

解题思路
令dp[i][j][k]表示第i行的状态为j时,共放置k个国王的方案数。
状态j的二进制即表示该行的放置方式,例如j为3时,放置的方式为101,即从右向左看第一位和第三位放置国王,其他位不放置。
可以预处理出每一行所有的合法状态,即两两不相邻的状态。
然后在相邻两层枚举所有合法状态,若这两层也不发生冲突,进行转移即可。
参考代码

#include <bits/stdc++.h>
using namespace std;
const int N = 10;
#define ll long long
int can[(1 << N)], tot;// 记录一行中合法的摆放方案
int cnt[(1 << N)]; // 合法方案数1的个数
ll dp[N + 1][(1 << N)][N * N + 10];
int n, k;
int sum(int x)//状态x中1的个数
{
    int t = 0;
    while (x)
    {
        if (x & 1)
            ++t;
        x >>= 1;
    }
    return t;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n >> k;
    for (int i = 0; i < (1 << n); ++i)//第一层状态要手推,无法转移
    {//注意枚举范围是[0, (1 << n) - 1], 因为棋盘只有这么大
        if (!(i & (i << 1)))
        {
            can[tot] = i;
            cnt[tot] = sum(i);
            dp[1][i][cnt[tot++]] = 1;
        }
    }
    for (int i = 2; i <= n; ++i)
    {//层数
        for (int j = 0; j < tot; ++j)
        {//当前层状态
            for (int a = 0; a < tot; ++a)
            {//上一层状态
                int x = can[j], y = can[a];
                if (x & y || (x << 1) & y || (x >> 1) & y)
                    continue;//状态冲突则跳过
                for (int b = cnt[j]; b <= k; ++b)
                {//枚举国王个数
                    dp[i][x][b] += dp[i - 1][y][b - cnt[j]];
                }
            }
        }
    }
    ll ans = 0;
    for (int i = 0; i < tot; ++i)
    {
        ans += dp[n][can[i]][k];
    }
    cout << ans << endl;
    return 0;

}

标签:状态,互不侵犯,int,状压,放置,2153,SCOI2005,DP
From: https://www.cnblogs.com/hetailang/p/17008508.html

相关文章

  • 国产DP4398 兼容替代CS4398 24Bit 192KHz数模转换芯片
    CS4398是一款24Bit/192KHz规格的解码芯片,它具有120分贝以上的讯噪比和动态范围,采用一个高级专用多位Delta-Sigma调制器,并整合了失配噪声整形技术。今天来讲讲它的国产替代......
  • 解决 Ubuntu apt-get Could not get lock varlibdpkglock-frontend
    解决Ubuntuapt-getCouldnotgetlock/var/lib/dpkg/lock-frontend.E:Couldnotgetlock/var/lib/dpkg/lock-frontend.Itisheldbyprocess1927(unattended-......
  • 在 Ubuntu 22.04 上部署 WordPress
    很简单的事情被搞得很复杂,踩了很多坑……以及莫名其妙的错误。本来碰壁了之后会一拖再拖。昨天新冠阳性难受了一整天,晚上退烧了,不想学数学就想搞搞这个,第二天早上就弄好了......
  • WordPress 分页链接函数 paginate_links
    paginate_links用法<?phpechopaginate_links($args);?>paginate_links默认参数<?php$args=array('base'=>'%_%','format'=>'......
  • Mac install Php and Wordpress
     1.安装php,参考:https://kittmedia.com/en/2021/macos-install-nginx-mysql-and-php-via-brew/   [email protected]   belowisthefinishoutput:To......
  • ACM预备队-week8(DP2)
    1.疯狂的采药完全背包题目链接:P1616疯狂的采药-洛谷|计算机科学教育新生态(luogu.com.cn)1#include<bits/stdc++.h>2usingnamespacestd;3#defineint......
  • 利用WordPress搭建属于自己的网站
    怎么用WordPress给自己搭建了一个网站?可能很多人都想拥有属于自己的网站,这篇文章就找你怎么利用WordPress搭建属于自己的网站。如果你也正好有搭建个人网站的想法,那么本文......
  • oss连接出现java.lang.IllegalArgumentException: Oss endpoint can't be empty.问题
    场景:在bootstrap.properties中编写nacos的配置,读取在nacos中定义的数据集连接ossspringboot版本为2.6.8结果就出现了以上错误原因:通过查找资料后发现,在springboot2.4......
  • 使用docker-compose配置两个wordpress网站时遇到的问题
    考试前两天想给女票也搞个博客,单独测试好好的,一起部署怎么都上不去,关键是理论上完全没问题。。最后调了半天(真·半天)发现是天杀的docker-compose必须mount与nginx一样的路......
  • [Note]Dp of Dp
    DpofDp可以类比普通的AC自动机上跑dp。以LG4590[TJOI2018]游园会为例。内层其实是一个LCS的dp,考虑建出一个LCS自动机。观察LCS的方程\(f_{i,j}=\max......