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的更多相关文章

  1. HDU 4832 Chess (DP)

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. hdu 4832 Chess(dp)

    Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. HDU 4832 Chess(DP+组合数学)(2014年百度之星程序设计大赛 - 初赛(第二轮))

    Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路 ...

  4. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  5. HDU 5724 Chess(国际象棋)

    HDU 5724 Chess(国际象棋) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  6. HDU 6787 Chess 2020百度之星 初赛三 T5 题解 dp

    传送门:HDU 6787 Chess Problem Description 你现在有一个棋盘,上面有 n 个格子,格子从左往右,1,-,n 进行标号.你可以在棋盘上放置恰好 m 个传送器,并且对于每 ...

  7. HDU 5724 Chess (sg函数)

    Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5724 Description Alice and Bob are playing a s ...

  8. HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. HDU 5742 Chess SG函数博弈

    Chess Problem Description   Alice and Bob are playing a special chess game on an n × 20 chessboard. ...

随机推荐

  1. CF 353A Domino

    #include<stdio.h> #include<math.h> int main() { int i,n; int x,y; int m1,m2,m3,m4; while ...

  2. servlet学习笔记二

    Servlet主要内容: 1)表单处理 2)乱码问题 3)页面跳转 4)生命周期 一.表单处理 Servlet获取表单数据 request.getParameter():通过表单参数名获取参数值 re ...

  3. KETTLE、spoon使用

    ETL是Extract”.“ Transform” .“Load”三个单词的首字母缩写分别代表了抽取.转换.装载.是数据仓库中重要的一环.ETL是数据的抽取清洗转换加载的过程,是数据进入数据仓库进行大 ...

  4. 怎么样能让自己的虚拟机上网win7 for linux

    我的电脑是win7 32位 虚拟机是linux 我是通过无线连接互联网的 点无线网络连接 右键 点共享 按照我的方式设置 接下来进入 里面会自动的选择这个 如果没有可以自己按照这个设置 接下来进入虚拟 ...

  5. myplan

    告警集成平台 – OneAlert(空) JumpServer-开源跳板机(堡垒机)搭建(空) Suricata入侵检测.防御系统搭建(空) Snort入侵检测系统搭建(空) OpenVas开放式漏洞 ...

  6. Linux功能-验证网络配置

    显示IP地址.设别和MAC地址等信息# ip addr show br0 订正:以下截图中硬件mac地址为第三行的"link/ether"一行所在的地方. ip命令可用在网络性能方 ...

  7. ExtJs布局大全

    1.Fit 布局 在Fit 布局中,子元素将自动填满整个父容器.注意:在fit 布局下,对其子元素设置宽度是无效的.如果在fit 布局中放置了多个组件,则只会显示第一个子元素.在Fit 布局中,子元素 ...

  8. JSP或HTML命名规范

    1.jsp与html文件名全部小写 2.数据/内容显示页 名词形式,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上“_list”或者其他的单词.例如:news_message.ht ...

  9. Js判断一个单词是否有重复字母

    今天上午刷到一道题,大体是写一个方法判断一个单词中是否有重复的字母(或者说一个字符串中是否有重复的字符).我的思路是一个字符一个字符地遍历,如果发现有重复的停止: function isIsogram ...

  10. 【分享】Maven插件的源码下载(SVN)

    偶然的情况下找到了Maven插件源码的网址,现分享下 http://svn.apache.org/repos/asf/maven/plugins/ 可以使用SVN下载,在添加新的资源路径时,把上面的网 ...