【简●解】[AHOI2009]中国象棋

【题目大意】#

叫你在n×m的棋盘上放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,问有多少种放置方法。

【关键词】#

  • DP
  • 分类讨论
  • 乘法和加法原理

【分析】#

仔细观察就会发现,棋盘中每行,每列只有放012个三种方案。如果我们把状态量设为列,那么知道任意两种方案的列数,即可用总列数减去它得到另一种方案的列数。

我们设状态方程:f[i][j][k],表示的是前i行,其中j列有1个棋子,k列有2个棋子的总方案数。

那么对于行的转移,我们有三种情况。

  1. 在第i行不放棋子。
  2. 在第i行放1个棋子。
  3. 在第i行放2个棋子。
  • 不放棋子,即f[i][j][k]=f[i1][j][k]

  • 1个棋子,又分两种情况:

    • 放在有1个棋子的列上,j+1列都可以放。即f[i][j][k]+=f[i1][j+1][k1](j+1)
    • 放在没有棋子的列上,m(j1)k列都可放。即f[i][j][k]+=f[i1][j1][k](mjk+1)
  • 2个棋子,分三种情况:

    • 2个都放在没有棋子的列上。即f[i][j][k]+=f[i1][j2][k]Cm(j2)k2
    • 2个都放在有1个棋子的列上。即f[i][j][k]+=f[i1][j+2][k2]Cj+22
    • 1个放在没有棋子的列上,另一个放在有1个棋子的列上。即f[i][j][k]+=f[i1][j][k1](mjk+1)

然后就可以A掉了,哦,记得开longlong。。。

【Code】#

Copy
#pragma GCC optimize("O3") #pragma GCC optimize("O2") #include<cstdio> #include<cstdlib> #include<cstring> #define ll long long #define R register using namespace std; const int MAX = 100 + 5; const int mod = 9999973; inline int read(){ int f = 1, x = 0;char ch; do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0'||ch>'9'); do {x = x*10+ch-'0'; ch = getchar(); } while (ch >= '0' && ch <= '9'); return f*x; } inline ll c(ll x) { return (x * (x - 1) / 2) % mod; } int n, m; ll f[MAX][MAX][MAX], ans; int main(){ n = read(), m = read(); f[0][0][0] = 1; for (R int i = 1;i <= n; ++i) { for (R int j = 0;j <= m; ++j) { for (R int k = 0;k <= m - j; ++k) { f[i][j][k] = f[i-1][j][k]; if (k > 0) { f[i][j][k] += (f[i-1][j+1][k-1] * (j+1)) % mod; f[i][j][k] %= mod; f[i][j][k] += (f[i-1][j][k-1] * j * (m-j-k+1)) %mod; f[i][j][k] %= mod; } if (j > 0) { f[i][j][k] += (f[i-1][j-1][k] * (m-j-k+1)) %mod; f[i][j][k] %= mod; } if (k > 1) { f[i][j][k] += (f[i-1][j+2][k-2] * c(j+2)) % mod; f[i][j][k] %= mod; } if (j > 1) { f[i][j][k] += (f[i-1][j-2][k] * c(m-j-k+2)) % mod; f[i][j][k] %= mod; } } } } for (R int i = 0;i <= m; ++i) { for (R int j = 0;j <= m; ++j) { ans += f[n][i][j]; ans %= mod; } } printf("%lld", (ans + mod) % mod); return 0; }
posted @   SilentEAG  阅读(182)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
CONTENTS