BZOJ 1801 AHOI2009 中国象棋 递归
标题效果:给定一个棋盘。放置一些枪。它需要随机两支枪不能互相攻击,评估的数目p模值
首先,两炮不攻击对方自由地等同于一条线最多可有只有两个枪
直形压力DP话是50分
考虑到每个列是等效 然后我们就可以直接递归
令f[i][j][k]为前i行有j列有一个炮 k列有两个炮
那么讨论
这行不放炮 方案数为f[i-1][j][k]
在原先没有炮的列放炮 方案数为f[i-1][j-1][k]*(n-j-k+1)
在原先有一个炮的列放炮 方案数为f[i-1][j+1][k-1]*(j+1)
在原先没有炮的两列放炮 方案数为f[i-1][j-2][k]*C(n-j-k+2,2)
分别在原先没有炮和原先有炮的两列放炮 方案数为f[i-1][j][k-1]*(n-j-k+1)*j
在原来有一个炮的两列放炮 方案数为f[i-1][j+2][k-2]*C(j+2,2)
然后就过了……这递推式真让人不敢写啊
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 110
#define MOD 9999973
using namespace std;
int m,n,ans;
long long f[M][M][M];
inline int C(int x,int y)
{
return x*(x-1)>>1;
}
int main()
{
int i,j,k;
cin>>m>>n;
f[0][0][0]=1;
for(i=1;i<=m;i++)
for(j=0;j<=n;j++)
for(k=0;j+k<=n;k++)
{
f[i][j][k]=f[i-1][j][k];
if(j>=1) f[i][j][k]+=f[i-1][j-1][k]*(n-j-k+1),f[i][j][k]%=MOD;
if(k>=1) f[i][j][k]+=f[i-1][j+1][k-1]*(j+1),f[i][j][k]%=MOD;
if(j>=2) f[i][j][k]+=f[i-1][j-2][k]*C(n-j-k+2,2),f[i][j][k]%=MOD;
if(k>=1) f[i][j][k]+=f[i-1][j][k-1]*(n-j-k+1)*j,f[i][j][k]%=MOD;
if(k>=2) f[i][j][k]+=f[i-1][j+2][k-2]*C(j+2,2),f[i][j][k]%=MOD;
}
for(j=0;j<=n;j++)
for(k=0;j+k<=n;k++)
ans+=f[m][j][k],ans%=MOD;
cout<<ans<<endl;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
BZOJ 1801 AHOI2009 中国象棋 递归的更多相关文章
- BZOJ 1801: [Ahoi2009]中国象棋
题目描述 //每行每列最多放两个,可以讨论第i-1行到第i行的每一种情况 #include<complex> #include<cstdio> using namespace ...
- 洛谷 P2051 [AHOI2009]中国象棋 解题报告
P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...
- luogu 2051 [AHOI2009]中国象棋
luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...
- [洛谷P2051] [AHOI2009]中国象棋
洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- Luogu P2051 [AHOI2009]中国象棋(dp)
P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...
- [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
- BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...
- [BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】
题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 DP ?) 可以发现,每一行和每一列的棋子个数不能 ...
随机推荐
- 【原创】纯OO:从设计到编码写一个FlappyBird (五)
第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和 ...
- 关于VCL的编写 (一) 如何编写自己的VCL控件
如何编写自己的VCL控件 用过Delphi的朋友们,大概对Delphi的最喜欢Delphi的不是他的强类型的pascal语法,而是强大的VCL控件,本人就是一位VCL控件的爱好者. VCL控件的开源, ...
- html5移动开发--js温馨提示
1.a标签执行js笔试 <a id="myID" href="javascript:myfuction();"></a> 2.实时监听i ...
- Light OJ Dynamic Programming
免费做一样新 1004 - Monkey Banana Problem 号码塔 1005 - Rooks 排列 1013 - Love Calculator LCS变形 dp[i][j][k]对于第一 ...
- c# 获取某个对象的[公有属性]的名称,类型,值
/// <summary> /// 获取某个对象的[公有属性]的名称,类型,值 /// </summary> /// <typeparam name="T&qu ...
- A WPF File ListView and ComboBox
源码下载: Download FileListView_Version_2.zip Download FileListView_Version_2_Binaries.zip Download File ...
- TypeScript 5 Angular 2
TypeScript 5 分钟快速入门 翻译:Angular 2 - TypeScript 5 分钟快速入门 原文地址:https://angular.io/docs/ts/latest/quicks ...
- 游戏 TRAP(SNRS)AlphaBeta版本
大家好,我是PuzzledBoy,大一(大二快).我是一个独立的游戏开发商,我的梦想是成为一名伟大的艺术家的第九 今天来公布我的第一个独立游戏TRAP(SNRS)的Alpha測试版啦啦啦~~~! 游戏 ...
- 上Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题和解决方法
近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比曾经每天40多w发送量暴增到每天达到200w发送量.由于是採用Java做发送底层,压力递增情况下不可避免的 ...
- 【C语言探索之旅】 第二部分第一课:模块化编程
内容简介 1.课程大纲 2.第二部分第一课: 模块化编程 3.第二部分第二课预告: 进击的指针,C语言王牌 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...