首页 > 其他分享 >[SCOI2005] 互不侵犯

[SCOI2005] 互不侵犯

时间:2024-12-16 23:30:56浏览次数:4  
标签:互不侵犯 sum dp Input SCOI2005 ll 国王

题目

Description

在 N×N 的棋盘里面放 K 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 8 个格子。

Input

只有一行,包含两个数 N,K。

Output

所得的方案数

Sample Input

3 2

Sample Output

16

思路

一道状压$dp$题;

因为要求国王数量,所以要多开一维数组记录国王总数;

用$dp[i][j][k]$表示第$i$行的状态$k$,并且到第$i$行为止一共放了$j$国王;

把不符合的国王状态去掉即可;

状态转移方程就为:  $dp[i][j+sum][k]+=dp[i-1][j][l]$

$sum$为当前行的国王数量;

 


 

代码

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll _=10;
ll n,m;
ll a[_][_],dp[_][_*_][1<<9];
int main()
{
    scanf("%lld%lld",&n,&m);
    dp[0][0][0]=1;
    for(ll i=1;i<=n;i++)
    for(ll k=0;k<=(1<<n)-1;k++)
    {
        if(k&(k>>1)) continue;//相邻不能放
        ll sum=0;
        for(ll j=1;j<=n;j++)
        if(k&(1<<(j-1)))
            sum++;//记录当前行国王数量
        for(ll l=0;l<=(1<<n)-1;l++)
        {
            if(k&l||k&(l<<1)||k&(l>>1))//保证两行的国王互不攻击
                continue;
            for(ll j=0;j<=m-sum;j++)//枚举到上一行的所有国王数量
                dp[i][j+sum][k]+=dp[i-1][j][l];
        }
    }
    ll ans=0;
    for(ll i=0;i<=(1<<n)-1;i++)
        ans+=dp[n][m][i];
    printf("%lld",ans);
    return 0;
}

 

 

 

 

 

标签:互不侵犯,sum,dp,Input,SCOI2005,ll,国王
From: https://www.cnblogs.com/wzx-RS-STHN/p/18611308

相关文章

  • 204 [SCOI2005] 互不侵犯
    //204[SCOI2005]互不侵犯.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/901在......
  • luogu P1896 [SCOI2005] 互不侵犯 题解
    luoguP1896[SCOI2005]互不侵犯题解题目传送门思路状态压缩dp。状态压缩dp对于每一行,用一个\(n\)位二进制数表示每行的状态,则对于上下两行之间,设上行的数字为\(a\),下行的数字为\(b\),状态不合法有三种情况:\(a\operatorname{and}b\neq0\),即存在上行与下行同......
  • luogu P1896 [SCOI2005] 互不侵犯 题解
    luoguP1896[SCOI2005]互不侵犯题解题目传送门思路状态压缩dp。状态压缩dp对于每一行,用一个\(n\)位二进制数表示每行的状态,则对于上下两行之间,设上行的数字为\(a\),下行的数字为\(b\),状态不合法有三种情况:\(a\operatorname{and}b\neq0\),即存在上行与下行同......
  • [题解]P1896互不侵犯
    数位DP模板题link题面[SCOI2005]互不侵犯题目描述在\(N\timesN\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\)个格子。输入格式只有一行,包含两个数\(N,K\)。输出格......
  • 互不侵犯 (状压)
    [SCOI2005]互不侵犯题目描述在\(N\timesN\)的棋盘里面放\(K\)个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\)个格子。输入格式只有一行,包含两个数\(N,K\)。输出格式所得的方案数样例#1......
  • P2330 [SCOI2005] 繁忙的都市
    原题链接题解最小生成树和最短路不一样的兄弟code#include<bits/stdc++.h>usingnamespacestd;intfa[306]={0};intfinds(intnow){return(fa[now]==now?now:finds(fa[now]));}structnode{intx,y,v;booloperator<(constnode&b)const{returnv<b.v;}......
  • P2330 [SCOI2005] 繁忙的都市
    原题链接法一:运用结论 最小生成树也是最小瓶颈树,但最小瓶颈树不一定是最小生成树。所以这题我们可以直接套用最小生成树模板#include<bits/stdc++.h>usingnamespacestd;structG{intfrom,to,value;};Ga[8005];intfather[305],n,m;voidbuild(){for(in......
  • 代码源:互不侵犯(SCOI,状压DP)
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,m;longlongf[10][1024][100];intv[1024];voidinit(){ for(inti=1;i<1<<n;++i) { intc=0; for(intj=i;j;j=j&(j-1))c++; v[i]=c; }}intmain(){ ios::sync_with_std......
  • #2153. 「SCOI2005」互不侵犯(状压DP)
    #2153.「SCOI2005」互不侵犯解题思路令dp[i][j][k]表示第i行的状态为j时,共放置k个国王的方案数。状态j的二进制即表示该行的放置方式,例如j为3时,放置的方式为101,即从右......
  • [SCOI2005]扫雷MINE
    题目描述链接:https://ac.nowcoder.com/acm/problem/20241来源:牛客网相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到......