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

#include <cstdio>
const int MOD = 9999973;
const int MAXN = 110;
int n, m, ans;
long long f[MAXN][MAXN][MAXN];
int C(int x){   //C(x,2)return x * (x - 1) / 2;
}
int main(){scanf("%d%d", &n, &m);f[0][0][0] = 1;for(int i = 1; i <= n; ++i)for(int j = 0; j <= m; ++j)for(int k = 0; j + k <= m; ++k){(f[i][j][k] += f[i - 1][j][k]) %= MOD;  //不放(f[i][j + 1][k] += f[i - 1][j][k] * (m - j - k)) %= MOD; //在没有棋子的列放1个if(j) (f[i][j - 1][k + 1] += f[i - 1][j][k] * j) %= MOD;   //在有棋子的列放1个(f[i][j + 2][k] += f[i - 1][j][k] * C(m - j - k)) %= MOD; //在没有棋子的列放2个(f[i][j][k + 1] += f[i - 1][j][k] * (m - j - k) * j) %= MOD;  //一个放在有棋子的列,一个放啊没有棋子的列if(j > 1) (f[i][j - 2][k + 2] += f[i - 1][j][k] * C(j)) %= MOD; //放2个在有棋子的列}for(int i = 0; i <= m; ++i)for(int j = 0; i + j <= m; ++j)(ans += f[n][i][j]) %= MOD;printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/Qihoo360/p/10918258.html

【洛谷 P2051】 [AHOI2009]中国象棋(DP)相关推荐

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

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

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

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

  3. 洛谷2051 [AHOI2009]中国象棋

    题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...

  4. P2051 [AHOI2009]中国象棋

    题目链接 题目大意: 给定n*m大小表格,让你摆放棋子,摆放的要求是同一行.同一列中的棋子数不超过两个,问一共可能有多少摆法. (不看别人的题解真不会开dp数组,太弱小了) dp数组开三位,表示已经处 ...

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

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

  6. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

    dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...

  7. LG_2051_[AHOI2009]中国象棋

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

  8. AHOI2009 中国象棋

    题目链接 题目描述 在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. (在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同 ...

  9. 洛谷 P1063 能量项链 区间dp

    洛谷 P1063 题意:在一串项链中,是环状的,第 i 颗珠子有两个能量a[i]和a[i+1],第i+1颗珠子有两个能量a[i+1]和a[i+2],可以合并两个珠子,得到a[i]*a[i+1]*a[i ...

最新文章

  1. (转)@ContextConfiguration注解说明
  2. iOS webview 点击按钮返回上一页面或者返回首页
  3. 得胜php100怎么样,优缺点评测得胜Q麦评价如何?怎么样呢?老司机透漏
  4. css flexbox模型_如何将Flexbox后备添加到CSS网格
  5. android view rotate,Android使用RotateImageView 旋转ImageView
  6. logstash安装
  7. 分享:假如浏览器和搜索引擎不再支持外部链接跳转,优化何去何从呢?
  8. nginx 强制跳转https_Nginx服务器环境手动安装Discuz! Q非详细教程
  9. 推荐一款轻量级的kafka管理平台:kafka-console-ui
  10. Vue+Webpack使用规范
  11. 机器学习课程笔记【十二】- 主成分分析
  12. 17.3.13--pycharm2和3的常识问题
  13. CSS3中的unicode字符编码,来添加图标
  14. 惠普暗影精灵2更新bios系统,防止电池鼓包
  15. java计算机毕业设计大数据在线考试系统在线阅卷系统及大数据统计分析源码+mysql数据库+系统+lw文档+部署
  16. 如何把图片的文字转换成word
  17. 诸行无常、诸法无我、诸漏皆苦、涅槃寂静
  18. android n改铃声,来电铃声自定义,我”响“你快乐!
  19. 概率论 —— 随机事件与概率
  20. 如何快速地向服务器传大文件,大文件如何快速传输

热门文章

  1. 40个非常有创意的404页面设计作品
  2. 【知识小课堂】 mongodb 之 objectId
  3. DATAGUARD配置错误的解决日志
  4. android StringBuffer实现换行
  5. android 打包jar包
  6. 新建parcel写入数据后,读取数据为null
  7. SpringMVC-Helloworld 的归纳理解
  8. 转-测试用例-基本控件
  9. 获得本机IP和访问服务的端口号(Java)
  10. 在矩阵上跑最小生成树