题解 洛谷 P2051 [AHOI2009]中国象棋

洛谷 P2051 [AHOI2009]中国象棋

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

1 3

输出样例#1:

7
说明

样例说明

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

数据范围

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

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

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

思路

显然,这道题可以用DP。

设计状态

f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]代表放了前i行,有j列是有 1 1 1个棋子,有k列是有 2 2 2个棋子的合法方案数。

确定情况

1.我们可以在当前第i行不放棋子。
2.我们可以在当前第i行放一个棋子。
3.我们可以在当前第i行放两个棋子。

分类讨论

一.不放棋子

我们可以直接继承上面的状态.即
f [ i ] [ j ] [ k ] = f [ i − 1 ] [ j ] [ k ] f [ i ] [ j ] [ k ] = f [ i − 1 ] [ j ] [ k ] f[i][j][k]=f[i-1][j][k]f[i][j][k]=f[i−1][j][k] f[i][j][k]=f[i1][j][k]f[i][j][k]=f[i1][j][k]

二.放一个棋子

显然我们不会选择放在有两个棋子的列,因此存在以下两种情况:
1.放在一个棋子的列
f [ i ] [ j ] [ k ] + = f [ i − 1 ] [ j + 1 ] [ k − 1 ] × ( j + 1 ) f[i][j][k]+=f[i-1][j+1][k-1]\times(j+1) f[i][j][k]+=f[i1][j+1][k1]×(j+1)
我们在某一个有一个棋子列放置棋子,会使这一列变为有两个棋子,即 f [ i − 1 ] [ j + 1 ] [ k − 1 ] f[i-1][j+1][k-1] f[i1][j+1][k1]的状态可以传递给 f [ i ] [ j ] [ k ] f[i][j][k] f[

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值