题目描述

这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!

输入输出格式

输入格式:

一行包含两个整数N,M,之间由一个空格隔开。

输出格式:

总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。

输入输出样例

输入样例#1:

1 3

输出样例#1:

7

说明

样例说明

除了3个格子里都塞满了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7种方案。

数据范围

100%的数据中N和M均不超过100

50%的数据中N和M至少有一个数不超过8

30%的数据中N和M均不超过6

首先可以知道可行的方案就是每行每列的放的炮数<=2

50%数据是状压dp,然后我们发现,他的矩形是规则的而且没有障碍一类的。

那么答案就跟他的每个具体排列没有直接关系,直接用dp[i][j]表示到当前行为止有多少炮数为1的列和炮数为2的列

由于每行也最多只能放两个炮,所以可以用dp[i][j]

转移到dp[i-1][j+1](有一个炮数为1的列在此行放上一个炮)

转移到dp[i+1][j](有一个炮数为0的列在此行放上一个炮)

转移到dp[i-2][j+2](有两个炮数为1的列在此行放上一个炮)

转移到dp[i+2][j](有两个炮数为0的列在此行放上一个炮)

转移到dp[i][j+1](有一个炮数为0的列在此行放上一个炮,有一个炮数为1的列在此行放上一个炮)

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100+10,mod=9999973;
long long n,m,dp[maxn][maxn],f[maxn][maxn],ans;int main() {scanf("%lld%lld",&n,&m);dp[0][0]=1;for(int i=1;i<=n;++i) {for(int j=0;j<=m;++j) for(int k=0;k<=m-j;++k) if(dp[j][k]){if(j)f[j-1][k+1]=(f[j-1][k+1]+dp[j][k]*j%mod)%mod;if(m-j-k)f[j+1][k]=(f[j+1][k]+dp[j][k]*(m-j-k)%mod)%mod;if(j>1)f[j-2][k+2]=(f[j-2][k+2]+dp[j][k]*j*(j-1)/2%mod)%mod;if(m-j-k>1)f[j+2][k]=(f[j+2][k]+dp[j][k]*(m-j-k)*(m-j-k-1)/2%mod)%mod;if(m-j-k)f[j][k+1]=(f[j][k+1]+dp[j][k]*(m-j-k)*j%mod)%mod;f[j][k]=(f[j][k]+dp[j][k])%mod;}memcpy(dp,f,sizeof(f));memset(f,0,sizeof(f));}for(int j=0;j<=m;++j) for(int k=0;k<=m-j;++k) ans=(ans+dp[j][k])%mod;printf("%lld",ans);return 0;
}

  

转载于:https://www.cnblogs.com/Serene-shixinyi/p/7478793.html

洛谷P2051 中国象棋相关推荐

  1. P2051 中国象棋

    P2051 中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中 ...

  2. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

  3. BZOJ 1801 [Ahoi2009]中国象棋(线性动规)(洛谷P2051)

    题意:就是在n*m的格子中放"炮"(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状 ...

  4. 【洛谷 P2051】 [AHOI2009]中国象棋(DP)

    题目链接 首先想到状压dp,但是\(n,m\)高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了. 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮. 然 ...

  5. 洛谷 - P2051 [AHOI2009]中国象棋(计数dp)

    题目链接:点击查看 题目大意:给出一个 n * m 的棋盘,可以在任意位置放置 "炮",问一共可以放置多少种可行的方案 题目分析:转换题意,就是问每一行.每一列至多有两个棋子的方案 ...

  6. 洛谷 动态规划一日游 P2577、P1070、P2051

    记 2018年3月19日 贼颓呢,一天就写了两道DP,还都不会写,这可GG. 动态规划真的难且有趣,算法题中动态规划占到了很大的比例,而且动态规划往往是辅助解决一些其他类型问题的基础,加深加强对动态规 ...

  7. 对于洛谷提高试炼场-动态规划篇的爆破

    题外话 由于本蒟蒻的动态规划实在是太弱啦,所以有必要爆破一下洛谷提高试炼场.里面有很多非常好,难度也合适的动态规划题--(然而你还是抄了不少题解) niconiconi~让我们一起开始爆破吧. lv- ...

  8. LG_2051_[AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  9. 【LGR-142-Div.4】洛谷入门赛 #13 考后分析与题解

    洛谷入门赛 #Round 13 比赛分析与总结 T1 魔方 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 数据规模与约定 分析 AC代码 注意 T2 教学楼 ...

  10. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

最新文章

  1. js base64编码解码 btoa atob 函数简介
  2. python用电度数设计_Python时间序列预测实战(电力负荷预测)
  3. TCP报文发送的那些事
  4. windows驱动开发学习
  5. linux下环境变量PATH的用法
  6. Hive一些参数设置
  7. html %3c自动转化,将几个文件中的大型HTML文件拆分
  8. kubernetes Deployment介绍
  9. Winxp系统文件夹完全解析
  10. 表情包网站项目(学习自程序员鱼皮)
  11. 教你用易语言编写一个简单的电脑病毒
  12. Servers IIS 重启命令
  13. python实现matlab_python 实现matlab的mapminmax方法
  14. mysql perl教程_使用 Perl 的 MySQL 事务
  15. MEX and Increments
  16. 十年测试老鸟聊聊移动端兼容性测试
  17. 为什么CAD输入文字时文字特别大但输入后就消失了?
  18. 5分钟教你做一个WebView广告过滤器
  19. Visio画图字体字号太小,默认8,如何设置默认更大字号
  20. U盘装win7系统nbsp;NTLDRnbsp;is…

热门文章

  1. Ubuntu全盘备份与恢复,亲自总结,实测可靠
  2. #Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet
  3. caffe 官方例程之R-CNN(物体检测)
  4. python使用scipy模块from scipy.misc import imread时报错:cannot import name imread问题解决
  5. 20170908算法工程师在线笔试之jd编程思路
  6. django(一)——在PyCharm下搭建开发环境
  7. 反向传播算法(backpropagation)
  8. 配置mysql字符_mysql字符设置
  9. 计算机科学技术专业词汇,计算机专业一些单词
  10. linux 终端 拼音,告诉你Ubuntu中文智能拼音输入法配置的方法及命令