【cofun1373】中国象棋(cchess)

Description
在N行M列的棋盘上,放若干个炮(可以是0个),使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国象棋中炮的行走方式大家应该很清楚吧.

Input Format
两个整数n,m
Output Format
方案总数 mod 9999973

Sample Input
1 3
Sample Output
7

Hint
【数据规模】30%的数据 n,m<=6
50%的数据n,m中至少有一个不超过8
100%的数据n,m<=100
虽然有取模,仍建议使用int64


  • 分析:

    • 对于50%的数据:n,m 中至少有一个不超过8
      可以考虑状压,把情况dfs出来再DP,类似炮兵阵地。
    • 对于100%的数据:类似组合数学的方法【网上看的。。but我觉得更像是普通的DP 2333】
      题目很坑 ,“中国象棋中炮的行走方式大家应该很清楚吧”。。然鹅肯定有人不清楚【比如我SZO】,科普来了~23333, 反正最终会get到:每一行每一列最多只能有两只棋子。于是推出了→
      *转移方程:
 f[i][j][k] = f[i - 1][j][k];//不放棋子if (j)
     f[i][j][k] += f[i - 1][j - 1][k] * (m - j + 1 - k);//在一个原来的空列上添加一只棋子if (k && j + 1 <= m)f[i][j][k] += f[i - 1][j + 1][k - 1] * (j + 1);//把一个原有一只棋子的列变为有两只棋子的列if (j > 1)
     f[i][j][k] += f[i - 1][j - 2][k] * ((m - j + 2 - k) * (m - j + 1 - k) / 2);//在两个原来的空列上分别添加一只棋子if (k > 1 && j + 2 <= m)f[i][j][k] += f[i - 1][j + 2][k - 2] * ((j + 2) * (j + 1) / 2);//把两个原有一只棋子的列分别变为有两只棋子的列if (j && k)f[i][j][k] += f[i - 1][j][k - 1] * j * (m - j - k + 1);//在一个原来的空列上添加一只棋子,并把一个原有一只棋子的列变为有两只棋子的列

f[i][j][k]: 到i行为止,有j列放一只棋子,k列放两只棋子。

【虽然有点麻烦但是好理解~有个问题 为啥在两个空列上分别添加不等下一回DP而要先转移呢?明天去问同学~【莫名Flag

  • 妈耶我可能傻了。。因为是枚举到该行,所以放两个列是在该行放两个,放一个列是在该行放一个,如果等到下一回循环,那就是在下一行放,这是不一样的。
    好尴尬-_-||问了一个神犇,可是每次都是他回复前我就突然开窍了。。QAQ

  • 代码:
 #include <bits/stdc++.h>using namespace std;const long long MO = 9999973;int n, m, i, j, k;long long f[105][105][105], ans;inline int read(){int x = 0, w = 1;char ch = 0;while(ch < '0' || ch > '9'){if (ch == '-')w = -1;ch = getchar();}while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();return x * w;} //读入优化inline void write(long long x){if (x < 0)putchar('-'), x = -x;if (x > 9)write(x / 10);putchar(x % 10 + '0');}//输出优化int main(){n = read(), m = read();//读入【本po代码补全设了读入优化,懒得删了~见谅=w=memset(f, 0, sizeof(f));f[0][0][0] = 1;for(i = 1; i <= n; i ++)for(j = 0; j <= m; j ++)for(k = 0; k + j <= m; k ++){f[i][j][k] = f[i - 1][j][k];if (j)f[i][j][k] += f[i - 1][j - 1][k] * (m - j + 1 - k);if (k && j + 1 <= m)f[i][j][k] += f[i - 1][j + 1][k - 1] * (j + 1);if (j > 1)f[i][j][k] += f[i - 1][j - 2][k] * ((m - j + 2 - k) * (m - j + 1 - k) / 2);if (k > 1 && j + 2 <= m)f[i][j][k] += f[i - 1][j + 2][k - 2] * ((j + 2) * (j + 1) / 2);if (j && k)f[i][j][k] += f[i - 1][j][k - 1] * j * (m - j - k + 1);f[i][j][k] %= MO; }//状态转移      for(i = 0; i <= m; i ++)for(j = 0; j + i <= m; j ++)ans = (ans + f[n][i][j]) % MO;write(ans);//统计答案并输出【输出优化原因同上,不过真的蛮省时的QUQreturn 0;}

码了两回qwq刚上手没有及时保存的好习惯ORZ闪退了TAT
睡觉啦~晚安安。O(∩_∩)O

【状压DP】【cofun1373】中国象棋(cchess)相关推荐

  1. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  2. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  3. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  4. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  5. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  6. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  7. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  8. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

  9. P2340 奶牛会展(状压dp)

    P2340 奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由 ...

  10. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

最新文章

  1. 【Java爬虫】爬取网页中的内容,提取其中文字
  2. 数据结构排序法之希尔排序法(Shell Sort)
  3. Serializer字段和选项
  4. Android 8.0 学习(23)---recovery 流程分析
  5. 敲黑板!从零开始,小白如何通过Kaggle竞赛提高数据分析能力!
  6. JS逆向---获取某知名外卖平台数据(_token)
  7. 思岚雷达A2在Linux下的使用教程
  8. 刽子手游戏 C语言实现
  9. 开源一个 Python 中文数据结构和算法教程
  10. java实现区块链_用Java实现一个简单的区块链
  11. unity教程:MMORPG网络游戏如何实现玩家同步
  12. 爬虫技术原来可以做这么多牛逼哄哄的事情!
  13. 【ARM】程序快速定位segmentation fault core dumped错误
  14. 阿里数据仓库架构与模型设计
  15. 差速小车的Cartographer建图
  16. python实现单词的简单爬取
  17. 离散:常用排列组合模型归纳,DFS代码实现
  18. windows安装linux
  19. hbuilder php断点调试,Hbuilder配置php断点调试
  20. Mac App图标制作工具——img2icns

热门文章

  1. 20220530数据结构绿皮书读书笔记
  2. 好文:「大搜车」凭什么获得阿里如此青睐?
  3. 基于Leaflet的leaflet-sidebar侧边栏组件集成
  4. ?php get_sidebar(); ?,常用函数-get_sidebar()
  5. 为树莓派打实时preempt_rt补丁
  6. 给系统添加个“任意门”日常设置来去自如
  7. 【机器学习】逻辑回归(理论)
  8. SLAM、SFM、MVG与MVS的区别和联系
  9. PHP主要是写什么 php文件怎么打开
  10. 打车日记 - 光头师傅