I

I

车II

车II


题目描述

有一个

n

m

n*m

n∗m的棋盘

(

n

m

80

,

n

m

80

)

(n、m≤80,n*m≤80)

(n、m≤80,n∗m≤80)要在棋盘上放

k

(

k

20

)

k(k≤20)

k(k≤20)个棋子,使得任意两个棋子不相邻。求合法的方案总数。


输入

n

,

m

,

k

n,m,k

n,m,k


输出

方案总数


样例输入

3 3 2

样例输出

24

题目解析

又双叒叕是一道状压DP的题。和相比,这道题的数据就大了许多

n

m

80

n、m≤80

n、m≤80。然而

n

m

80

n*m≤80

n∗m≤80,所以还是可以用状压来写。
首先,我们用一个

D

F

S

DFS

DFS来枚举他所有的状态

void dfs(int ans, int pos, int flag)
{
if(pos>n)
{
s[++num]=ans;
c[num]=flag;
return ;
}
dfs(ans, pos+1, flag);
dfs(ans+(1<<pos-1), pos+2, flag+1);
}

然后就开始

D

P

DP

DP;用两个变量来枚举状态,分别为当前状态和转移状态,要想它们之间能够互相转移,就必须有一个为

0

0

0,然后在枚举放的棋子个数。


code

#include<stdio.h>

#include<iostream> 

#include<algorithm>

using namespace std;

int n, m, k, num;
int s[10005], c[10005], f[85][1<<9][255]; void dfs(int ans, int pos, int flag)
{
if(pos>n)
{
s[++num]=ans;
c[num]=flag;
return ;
}
dfs(ans, pos+1, flag);
dfs(ans+(1<<pos-1), pos+2, flag+1);
} int main ()
{
scanf ("%d%d%d", &n, &m, &k);
if (n>m) swap(n,m);
dfs(0, 1, 0);
for (int i=1; i<=num; ++i) f[1][s[i]][c[i]]=1;
for (int i=2; i<=m; ++i)
for (int j=1; j<=num; ++j)
for (int r=1; r<=num; ++r)
if (!(s[j]&s[r]))
{
for (int l=0; l<=k; ++l)
if (l>=c[j])
f[i][s[j]][l]+=f[i-1][s[r]][l-c[j]];
}
int ans=0;
for (int i=1; i<=num; ++i) ans+=f[m][s[i]][k];
printf("%d",ans);
return 0;
}

[状压DP]车II的更多相关文章

  1. [状压DP]车

    车 车 车 题目描述 在 n ∗ n n*n n∗n( n ≤ 20 n≤20 n≤20)的方格棋盘上放置 n n n个车(可以攻击所在行.列),有些格子不能放,求使它们不能互相攻击的方案总数. 输入 ...

  2. 状压DP【p2622】 关灯问题II

    题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...

  3. 关灯问题II 状压DP

    关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...

  4. [状压DP]关灯问题II

    关 灯 问 题 I I 关灯问题II 关灯问题II 题目描述 现有n盏灯,以及 m m m个按钮.每个按钮可以同时控制这 n n n盏灯--按下了第 i i i个按钮,对于所有的灯都有一个效果.按下i ...

  5. HDU 6149 Valley Numer II 状压DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6149 题意:中文题目 解法:状压DP,dp[i][j]代表前i个低点,当前高点状态为j的方案数,然后枚 ...

  6. HDU 6149 Valley Numer II(状压DP)

    题目链接 HDU6149 百度之星复赛的题目……比赛的时候并没有做出来. 由于低点只有15个,所以我们可以考虑状压DP. 利用01背包的思想,依次考虑每个低点,然后枚举每个状态. 在每个状态里面任意枚 ...

  7. 洛谷 P2622 关灯问题II【状压DP】

    传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...

  8. 状压dp专题复习

    状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...

  9. [状压DP]炮兵阵地

    炮 兵 阵 地 炮兵阵地 炮兵阵地 题目描述 司令部的将军们打算在 N ∗ M N*M N∗M的网格地图上部署他们的炮兵部队.一个 N ∗ M N*M N∗M的地图由 N N N行 M M M列组成, ...

随机推荐

  1. Flutter 1.17.x

    Flutter 1.17.x Flutter (Channel stable, v1.17.3, on Mac OS X 10.15.5 19F101, locale en-CN) https://f ...

  2. js IdleDetector 检测用户是否处于活动状态API

    btn.addEventListener("click", async () => { try { const state = await Notification.requ ...

  3. Mac Benchmarks

    Mac Benchmarks https://browser.geekbench.com/mac-benchmarks https://www.geekbench.com/ https://www.f ...

  4. 最常用SQL joins:内连接(交集)、左外连接、右外连接、左连接、右连接、全连接(并集),全外连接

    1.内连接.两个表的公共部分用Inner join,Inner join是交集的部分. Select * from TableA A inner join TableB B on A.key=B.ke ...

  5. IntelliJ Idea tomcat 控制台输出乱码

    reference: https://blog.csdn.net/dandandeshangni/article/details/485442211. 在运行/调试 配置对话框的Startup/Con ...

  6. 【ZeyFraのJavaEE开发小知识01】@DateTimeFomat和@JsonFormat

    @DateTimeFormat 所在包:org.springframework.format.annotation.DateTimeFormat springframework的注解,一般用来对Dat ...

  7. 第47天打卡学习(单例模式 深入了解CAS 原子引用 各种锁的理解)

    18彻底玩转 单例模式 饿汉式 DCL懒汉模式 探究! 饿汉式  package com.kuang.single; //饿汉式单例 //单例模式重要思想是构造器私有 public class Hun ...

  8. 利用Visual Studio调试JavaScript脚本

    方法1: 方法2: 打开IE,按F12调试. 方法3: JS断电点debugger代替

  9. 《C++ Primer》笔记 第6章 函数

    任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字(形参就相当于该函数的局部变量). 形参名是可选的,但是由于我们无法使用未命名的形参,所以形参一般都应该有个名字. ...

  10. pytorch中多个loss回传的参数影响示例

    写了一段代码如下: import torch import torch.nn as nn import torch.nn.functional as F class Test(nn.Module): ...