HDU 4832 Chess
Chess
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 812 Accepted Submission(s): 325
Problem Description
小度和小良最近又迷上了下棋。棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M)。在他们的规则中,“王”在棋盘上的走法遵循十字路线。也就是说,如果“王”当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个。

图1 黄色部分为棋子所控制的范围
小度觉得每次都是小良赢,没意思。为了难倒小良,他想出了这样一个问题:如果一开始“王”在(x0,y0)点,小良对“王”连续移动恰好K步,一共可以有多少种不同的移动方案?两种方案相同,当且仅当它们的K次移动全部都是一样的。也就是说,先向左再向右移动,和先向右再向左移动被认为是不同的方案。
小良被难倒了。你能写程序解决这个问题吗?
Input
输入包括多组数据。输入数据的第一行是一个整数T(T≤10),表示测试数据的组数。
每组测试数据只包括一行,为五个整数N,M,K,x0,y0。(1≤N,M,K≤1000,1≤x0≤N,1≤y0≤M)
Output
对于第k组数据,第一行输出Case #k:,第二行输出所求的方案数。由于答案可能非常大,你只需要输出结果对9999991取模之后的值即可。
Sample Input
2
2 2 1 1 1
2 2 2 1 1
Sample Output
Case #1:
2
Case #2:
4
Source
[2014年百度之星程序设计大赛 - 初赛(第二轮)](http://acm.hdu.edu.cn/search.php?field=problem&key=2014%C4%EA%B0%D9%B6%C8%D6%AE%D0%C7%B3%CC%D0%F2%C9%E8%BC%C6%B4%F3%C8%FC+-+%B3%F5%C8%FC%A3%A8%B5%DA%B6%FE%C2%D6%A3%A9&source=1&searchmode=source)
解析:直接进行DP会超时。由于行列独立,可以分开计数,做2个一维的DP,然后组合起来就可以了。
```
#include
#include
#define ll long long
const int MOD = 9999991;
const int MAXN = 1005;
int N, M, K, x0, y0;
ll dp[2][MAXN][MAXN];
ll sum[2][MAXN];
int C[MAXN][MAXN];
void init()
{
C[0][0] = 1;
for(int i = 1; i < MAXN; ++i){
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; ++j)
C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
}
}
void work(int n, int t, int p)
{
dp[p][0][t] = 1;
sum[p][0] = 1;
for(int i = 1; i <= K; ++i){
for(int j = 1; j <= n; ++j){
if(j - 1 > 0) dp[p][i][j] += dp[p][i-1][j-1];
if(j - 2 > 0) dp[p][i][j] += dp[p][i-1][j-2];
if(j + 1 <= n) dp[p][i][j] += dp[p][i-1][j+1];
if(j + 2 <= n) dp[p][i][j] += dp[p][i-1][j+2];
dp[p][i][j] %= MOD;
sum[p][i] = (sum[p][i] + dp[p][i][j]) % MOD;
}
}
}
void solve()
{
memset(sum, 0, sizeof(sum));
memset(dp, 0, sizeof(dp));
work(N, x0, 0);
work(M, y0, 1);
long long res = 0;
for(int i = 0; i <= K; ++i)
res = (res + (((C[K][i] * sum[1][i]) % MOD) * sum[0][K-i]) % MOD) % MOD;
printf("%I64d\n", res);
}
int main()
{
init();
int t, cn = 0;
scanf("%d", &t);
while(t--){
scanf("%d%d%d%d%d", &N, &M, &K, &x0, &y0);
printf("Case #%d:\n", ++cn);
solve();
}
}
HDU 4832 Chess的更多相关文章
- HDU 4832 Chess (DP)
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 4832 Chess(dp)
Chess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 4832 Chess(DP+组合数学)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路 ...
- HDU 4832(DP+计数问题)
HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...
- HDU 5724 Chess(国际象棋)
HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 6787 Chess 2020百度之星 初赛三 T5 题解 dp
传送门:HDU 6787 Chess Problem Description 你现在有一个棋盘,上面有 n 个格子,格子从左往右,1,-,n 进行标号.你可以在棋盘上放置恰好 m 个传送器,并且对于每 ...
- HDU 5724 Chess (sg函数)
Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...
- HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))
Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 5742 Chess SG函数博弈
Chess Problem Description Alice and Bob are playing a special chess game on an n × 20 chessboard. ...
随机推荐
- weka平台下手动造.arff的数据
若数据为 sunny,hot,high,FALSE,nosunny,hot,high,TRUE,noovercast,hot,high,FALSE,yesrainy,mild,high,FALSE,y ...
- 【Apache运维基础(4)】Apache的Rewrite攻略(1)
简述 Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式.如果要想用到rewrite模块 ...
- Linux基础--例行工作
1.仅进行一次的工作排程--at at的工作情况其实是这样的: 1)先找寻/etc/at.allow这个档案,写在这个档案中的使用者才能使用at,没有在这个档案中的使用者则不能使用at(即使没有写在a ...
- JLINK固件,JLINK驱动和JLINK硬件版本之间的关系,以及固件升级方法
初学者容易在这几个问题上面犯迷糊,这里简单的说说. 1. JLINK硬件版本首先说JLINK的硬件版本有V7,V8和V9,相信这一点大家应该都没问题,那怎么看自己手头的JLINK是哪个硬件版本呢, ...
- CentOS 7快速搭建Nodejs开发环境
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好.学习Nodejs首先需要会安装环境.这里我介绍如 ...
- 在CentOS 7上给一个网卡分配多个IP地址
有时你也许想要给一个网卡多个地址.你该怎么做呢?另外买一个网卡来分配地址?在小型网络中其实不用这么做.我们现在可以在CentOS/RHEL 7中给一个网卡分配多个ip地址.想知道怎么做么?好的,跟随我 ...
- Java实现cache的基本机制
我这里说的cache不是指CPU和RAM之间的缓存,而是Java应用中间常用的缓存.最常使用的场合就是访问数据库的时候为了提高效率而使用的 cache.一般的用法就是把数据从数据库读到内存,然后之后的 ...
- 设置PL/SQL Developer记住用户名密码
- webServer xampp的安装及使用
一.下载: 西装xampp1.73版本,其他版本可能会出错,为了你能顺利安装,最好用此版本: 二.安装: 1.安装路径,最好不要放到系统盘去[c:],建议非系统盘都可,尤其是早期的XAMPP版本可能默 ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...