JZOJ 1667【AHOI2009】中国象棋——dp
题目:https://jzoj.net/senior/#main/show/1667
只注重0、1、2的列有多少个,不注重它们的位置,就能记录了。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int N=105,mod=9999973; int n,m,dp[2][N][N][N],ans,jc[N],jcn[N]; int pw(int x,int k) {int ret=1;while(k){if(k&1)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=1;}return ret; } void init() {jc[0]=1;for(int i=1;i<=m;i++)jc[i]=(ll)jc[i-1]*i%mod;/////m not njcn[m]=pw(jc[m],mod-2);for(int i=m-1;i>=0;i--)jcn[i]=(ll)jcn[i+1]*(i+1)%mod; } int C(int n,int m) {return (ll)jc[n]*jcn[m]%mod*jcn[n-m]%mod; } int main() {scanf("%d%d",&n,&m);dp[0][m][0][0]=1;init();for(int i=1;i<=n;i++){int d=(i&1);for(int x=0;x<=m;x++)for(int y=0;y<=m;y++){int z=m-x-y;dp[d][x][y][z]=dp[!d][x][y][z];if(y)(dp[d][x][y][z]+=(ll)dp[!d][x+1][y-1][z]*(x+1)%mod)%=mod;//0->1if(z)(dp[d][x][y][z]+=(ll)dp[!d][x][y+1][z-1]*(y+1)%mod)%=mod;//1->2if(y>1)(dp[d][x][y][z]+=(ll)dp[!d][x+2][y-2][z]*C(x+2,2)%mod)%=mod;//0,0->1,1if(y&&z)(dp[d][x][y][z]+=(ll)dp[!d][x+1][y][z-1]*(x+1)%mod*y%mod)%=mod;//0,1->1,2if(z>1)(dp[d][x][y][z]+=(ll)dp[!d][x][y+2][z-2]*C(y+2,2)%mod)%=mod;//1,1->2,2 }}int d=(n&1);for(int x=0;x<=m;x++) for(int y=0;y<=m;y++) (ans+=dp[d][x][y][m-x-y])%=mod;printf("%d\n",ans);return 0; }
转载于:https://www.cnblogs.com/Narh/p/9427241.html
JZOJ 1667【AHOI2009】中国象棋——dp相关推荐
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...
- BZOJ 1801 [Ahoi2009]中国象棋(线性动规)(洛谷P2051)
题意:就是在n*m的格子中放"炮"(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状 ...
- AHOI2009 中国象棋
题目链接 题目描述 在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. (在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同 ...
- LG_2051_[AHOI2009]中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- 【洛谷 P2051】 [AHOI2009]中国象棋(DP)
题目链接 首先想到状压dp,但是\(n,m\)高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了. 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮. 然 ...
- 洛谷 - P2051 [AHOI2009]中国象棋(计数dp)
题目链接:点击查看 题目大意:给出一个 n * m 的棋盘,可以在任意位置放置 "炮",问一共可以放置多少种可行的方案 题目分析:转换题意,就是问每一行.每一列至多有两个棋子的方案 ...
- 洛谷2051 [AHOI2009]中国象棋
题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...
- [AHOI2009]中国象棋
https://www.luogu.org/problemnew/show/P2051 C++版本一 数位DP变形 棋子的顺序是无所谓的,并不需要准确知道当前棋盘的状态 于是有了100分做法:dp[i ...
最新文章
- 基于视频理解TSM和数据集20bn-jester-v1的27类手势识别
- 转 sessionid如何产生?由谁产生?保存在哪里?
- 如何设计秒杀服务器的限流策略
- lua学习笔记之模块、包
- Matlab Compiler路径
- hugo 能做web开发吗_如何自托管Hugo Web应用
- python基础--列表,元组
- DBSCAN聚类算法C++实现
- 【数据结构与算法C语言版】基础代码整理 思维导图
- 四川自考计算机信息管理专业,计算机信息管理专业2019年10月四川自考科目及考试时间[本科]...
- xheditor 内容保存时 不转义html特殊字符,XHEditor使用文档(转载收藏)
- java马里奥_java马里奥毕业设计
- 128g固态加1linux分区,应该如何使用128G加1T机械硬盘?要不要分盘?
- 操作系统期末实验:多用户二级文件系统
- 04-栈和队列-循环队列的基本使用
- DHCP如何分配IP地址
- 红外避障模块c语言编写程序,红外避障模块(红外对管)51单片机驱动源程序
- 学习阶段C语言程序汇总
- Visual Studio开发STM32,VS+VisualGDB下载及配置
- 基于蜣螂算法改进的随机森林回归算法 - 附代码
热门文章
- 当把CocoaPods生成的workspace移动到上层目录时
- HDU 1034 - Candy Sharing Game
- 【云图】如何制作中国贪官落马图?
- 如何运行网页html,如何在网页中运行html代码
- CCCC-GPLT L3-015. 球队“食物链” 团体程序设计天梯赛
- Android Device Monitor 的 File Explorer 打开一片空白,不显示文件
- cin.getline()、getline()、gets()、cin.get(),getchar()的区别
- 停车场管理系统 java_使用java编写一个停车场管理系统
- 几个常用存储引擎的特点
- linux之删除vi残留的swp文件