题目描述

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

输入格式:

只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

输出格式:

所得的方案数

输入样例

3 2

输出样例

16


题(mang)目(mu)分析:

爆裂吧!!!五重循环!!!!

我们用三维数组dp[i][j][l]

表示前i行共放了l个king

且第i行状态为j的方案数

先把只考虑一行的合法方案枚举出来存入state[]数组

同时预处理dp[1][][]的所有情况

void check(ll x)
{
    //将状态x分别左/右移判断是否有相邻的king
    if( !(x & (x<<1) ) && !(x & (x>>1) ) )
    {
        ll num=get(x);//计算该状态有多少个king
        if(num>k) return;//若num>k,则不合法
        else state[++cnt]=x,sum[cnt]=num,dp[1][x][num]=1;
        //储存该状态,并更新dp数组
    }
}

对于0<= x <= (1<< n)-1都要调用

接下来状态转移方程

dp[i][j][l]+=dp[i-1][t][p]

for(int i=2;i<=n;i++)//第1行已预处理,所以从第二行开始递推
for(int j=1;j<=cnt;j++)//枚举第2行状态
for(int l=0;l<=k;l++)//枚举前i行所放king数量
for(int t=1;t<=cnt;t++)//枚举i-1行状态
for(int p=0;p<=l;p++)//枚举前i-1行所放king数量
if( test(state[j],state[t]) && p+sum[j]==l )//判断是否合法
dp[i][state[j]][l]+=dp[i-1][state[t]][p];//更新

最后ans等于所有dp[n][j][k]相加


#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;

ll n,k;
ll state[1010];
ll sum[1010];
ll dp[10][1010][100];
ll cnt;
ll ans;

ll get(ll x)
{
    ll num=0;
    while(x>0)
    {
        if(x&1) num++;
        x=x>>1;
    }
    return num;
}

void check(ll x)
{
    if( !(x & (x<<1) ) && !(x & (x>>1) ) )
    {
        ll num=get(x);
        if(num>k) return;
        else state[++cnt]=x,sum[cnt]=num,dp[1][x][num]=1;
    }
}

bool test(ll x,ll y)
{
    if(x&y) return false;
    if((x<<1)&y) return false;
    if((x>>1)&y) return false;
    return true;
}

int main()
{
    cin>>n>>k;
    for(int i=0;i<=(1<<n)-1;i++)
    check(i);

    for(int i=2;i<=n;i++)
    for(int j=1;j<=cnt;j++)
    for(int l=0;l<=k;l++)
    for(int t=1;t<=cnt;t++)
    for(int p=0;p<=l;p++)
    if( test(state[j],state[t]) && p+sum[j]==l )
    dp[i][state[j]][l]+=dp[i-1][state[t]][p];

    for(int i=1;i<=cnt;i++)
    ans+=dp[n][state[i]][k];

    cout<<ans;
    return 0;
}

洛谷P1896 [SCOI2005]互不侵犯King【状压DP】的更多相关文章

  1. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

  2. 洛谷P1896 [SCOI2005]互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  3. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  4. 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP

    经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...

  5. [BZOJ1087] [SCOI2005] 互不侵犯King (状压dp)

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

  6. 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...

  7. 洛谷 P1896 [SCOI2005]互不侵犯King

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...

  8. BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

    [题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...

  9. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

随机推荐

  1. 织梦DedeCMS提示信息框的修改,修改ShowMsg方法函数

    http://www.360doc.com/content/14/0408/13/16498929_367236469.shtml 织梦DedeCMS系统,处处都在用到提示信息,但是这个提示框,前台后 ...

  2. Docker问题: Layer already being pulled by another client. Waiting.什么原因

    问题描述:Layer already being pulled by another client. Waiting. 问题分析:这是 1.8版本的一个bug,会在1.9版本中修复.http://st ...

  3. ajax和跨域

    一.简介 ajax是什么? AJAX(Asynchronous JavaScript and XML) 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX, (异步的JavaSc ...

  4. Java 获取年月日方法

    package com.ob; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util ...

  5. linux 如何降低入向软中断占比

    最近遇到一个问题,当tcp收包的时候,我们的服务器的入向软中断比例很高. 我们知道,napi模式,可以降低收包入向软中断占比,那么,针对napi模式,能不能优化?本文针对2.6.32-358内核进行分 ...

  6. FORTH 安装使用

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  7. mysql explain用法和结果的含义

    转自:http://blog.chinaunix.net/uid-540802-id-3419311.html explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择 ...

  8. vs Code 运行一个本地WEB服务器

    VS Code作为前端开发工具,值得推荐,用上之后,爱不释手 当我们建立一个全静态的前端项目时,如果需要将整个项目运行起来也非常简单,两步即可: 1.安装npm install -g live-ser ...

  9. 用Python实现几种排序算法

    #coding=utf-8 # 1 快速排序算法 def qksort(list): if len(list)<=1: return list else: pivot = list[0] les ...

  10. Tomcat服务器的Web安全的解决方法

    .概述 在任何一种WEB应用开发中,不论大中小规模的,每个开发者都会遇到一些需要保护程序数据的问题,涉及到用户的LOGIN ID和PASSWORD.那么如何执行验证方式更好呢?实际上,有很多方式来实现 ...