bzoj1801

【bzoj1801】[Ahoi2009]chess 中国象棋

2014年6月7日1,2581

Description

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

Input

一行包含两个整数N,M,中间用空格分开.

Output

输出所有的方案数,由于值比较大,输出其mod 9999973

Sample Input

1 3

Sample Output

7

HINT

除了在3个格子中都放满炮的的情况外,其它的都可以.
100%的数据中N,M不超过100
50%的数据中,N,M至少有一个数不超过8
30%的数据中,N,M均不超过6

一行最多放两个,一列最多放两个。

f[i][j][k]表示前i行有j行有一个,k行有两个

然后转移显然。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define ll long long
 7 using namespace std;
 8
 9 const int mod=9999973,NN=107;
10
11 int n,m;
12 ll ans,f[NN][NN][NN];
13
14 inline ll C(ll x)
15 {
16     return x*(x-1)/2;
17 }
18 int main()
19 {
20     scanf("%d%d",&n,&m);
21     f[0][0][0]=1;
22     for(int i=1;i<=n;i++)
23         for(int j=0;j<=m;j++)
24             for(int k=0;k<=m-j;k++)
25             {
26                 f[i][j][k]=f[i-1][j][k];                                    //什么都不放、
27                 if(j)f[i][j][k]+=f[i-1][j-1][k]*(m-j-k+1);                    //在0个中再放一个。
28                 if(j>1)f[i][j][k]+=f[i-1][j-2][k]*C(m-j-k+2);                //在0中放两个。
29                 if(k&&j<m)f[i][j][k]+=f[i-1][j+1][k-1]*(j+1);                //在1个中放1个。
30                 if(j&&k)f[i][j][k]+=f[i-1][j][k-1]*(m-j-k+1)*j;                //在0个和1个割放一个。
31                 if(k>1&&j<m-1)f[i][j][k]+=f[i-1][j+2][k-2]*C(j+2);            //在1个中放两个。
32                 f[i][j][k]%=mod;                                            //取模数。
33             }
34     for(int i=0;i<=m;i++)
35         for(int j=0;j<=m-i;j++)
36             ans+=f[n][i][j];
37     ans%=mod;
38
39     printf("%lld",ans);
40 }
时间: 2024-11-07 19:16:27

bzoj1801的相关文章

bzoj1801: [Ahoi2009]chess 中国象棋 [dp]

Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中N,M不超过10050%的数据中,N,M至少有一个数不超过

bzoj1801 [Ahoi2009]chess 中国象棋

Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中N,M不超过10050%的数据中,N,M至少有一个数不超过

[BZOJ1801][AHOI2009]中国象棋(递推)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1801 分析: 只会50的状态压缩…… 然后搜了下题解,发现是dp 首先易得每行每列至多有2个棋子 设f[i][j][k]表示前i行中有j列放了1个棋子,有k列放了2个棋子,那么就有m-j-k列没有放棋子 那么下面考虑第i行放棋子情况和前i-1行放棋子状态的关系: 1.如果第i行不放棋子:f[i][j][k]+=f[i-1][j][k] 2.如果第i行放1个棋子 ①该棋子放在之前没有放

动态规划 BZOJ1801 [Ahoi2009]chess 中国象棋

1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1861  Solved: 1068[Submit][Status][Discuss] Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较

BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)

题目链接 [Ahoi2009]chess 中国象棋 设f[i][j][k]为前i行,j列放了1个棋子,k列放了2个棋子的方案数 分6种情况讨论,依次状态转移. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 7 typedef long long LL; 8 const LL mod = 9999973; 9 int n

BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】

题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. 输出格式 输出所有的方案数,由于值比较大,输出其mod 9999973 输入样例 1 3 输出样例 7 提示 除了在3个格子中都放满炮的的情况外,其它的都可以. 100%的数据中N,M不超过100 50%的数据中,N,M至少有一个数不超过8 30%的数据中,N,M均不超过6 题解 一道dp题 设\

BZOJ1801:[AHOI2009]中国象棋——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=1801 https://www.luogu.org/problemnew/show/P2051 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧

【BZOJ1801】【Ahoi2009】chess 中国象棋

Time Limit: 10 Sec Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N,M,中间用空格分开. Output 输出所有的方案数,由于值比较大,输出其mod 9999973 Sample Input 1 3 Sample Output 7 HINT 除了在3个格子中都放满炮的的情况外,其它的都可以

【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs

都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 9 #define