P2051 中国象棋

P2051 中国象棋



Dp题
一开始的我是考虑状呀的。 然后发现。
voc,怎么n和m是100的。然后果断GG

想了许久。然后发现,这个炮只是对他所在的行与列产生影响,对于其他的行与列来说并没有什么影响。

而一行中的炮,我们可以一次把他干出来。

所以影响我们的决策的时候,只有列上的情况对我们有影响。

然后又因为不同列之间互不影响,然后我们只需要记录每种情况的个数就Ok了

我们考虑设计如下状态
\(f[i],[j],[k]\)表示当前我们到了第i行,有\(j\)个列上有一个炮,有\(k\)个列上有两个炮。

考虑转移

第i行不放炮
\(f[i][j][k]+=f[i-1][j][k]\)

第i行放一个炮
1.放在没有炮的列上
\(f[i][j][k]+=f[i-1][j-1][k]*(m-j-k+1)\)
2.放在一个炮的列上
\(f[i][j][k]+=f[i-1][j+1][k-1]*(j+1)\)

第i行放两个炮
1.都放在没有炮的列上
\(f[i][j][k]+=f[i-1][j-2][k]*C^2_{m-j-k+2}\)
2.都放在一个炮的列上
\(f[i][j][k]+=f[i-1][j+2][k-2]*C^2_{j+2}\)
3.一个放在一个炮的列上,另一个放在没有炮的列上
\(f[i][j][k]+=f[i-1][j][k-1]*j*(m-j-k+1)\)

乘法原理和加原理搞一搞就可以了

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
const int maxn=110;
long long f[maxn][maxn][maxn];
long long mode(long long val)
{
    return val%9999973;
}
long long C(int T)
{
    return mode(T*(T-1)/2);
}
int main()
{
    f[0][0][0]=1;
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=m;j++)
            for(int k=0;k+j<=m;k++)
            {
                f[i][j][k]=mode(f[i][j][k]+f[i-1][j][k]);//注意判断边界
                if(j-1>=0)  f[i][j][k]=mode(f[i][j][k]+f[i-1][j-1][k]*(m-j+1-k));
                if(j-2>=0)  f[i][j][k]=mode(f[i][j][k]+f[i-1][j-2][k]*C(m-j+2-k));
                if(k-1>=0)  f[i][j][k]=mode(f[i][j][k]+f[i-1][j][k-1]*j*(m-j-k+1));
                if(k-1>=0&&j+1<=m)  f[i][j][k]=mode(f[i][j][k]+f[i-1][j+1][k-1]*(j+1));
                if(k-2>=0&&j+2<=m)  f[i][j][k]=mode(f[i][j][k]+f[i-1][j+2][k-2]*C(j+2));
            }
    long long ans=0;
    for(int i=0;i<=m;i++)
        for(int j=0;i+j<=m;j++)
            ans=mode(ans+f[n][i][j]);
    printf("%lld",ans);
}

原文地址:https://www.cnblogs.com/Lance1ot/p/9810051.html

时间: 2024-10-16 20:03:13

P2051 中国象棋的相关文章

【Luogu】P2051中国象棋(DP)

题目链接 去看STDCALL的题解吧 #include<cstdio> #include<cctype> #define mod 9999973 inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(

Luogu P2051 [AHOI2009]中国象棋(dp)

P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含两个整数 \(N\) , \(M\) ,之间由一个空格隔开.

P2051 [AHOI2009]中国象棋

题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含两个整数N,M,之间由一个空格隔开. 输出格式: 总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果. 输入输出样例 输入样例#

p2051 [AHOI2009]中国象棋. (bzoj 1801)

题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 40pts 考试遇到了这个题,玄学打表得了\(40pts\) 玄学打表吼啊 xjb分析 正解竟然是个\(DP\)? 还有人说是状压\(DP\)?哪里来的状压啊! 前置知识 考虑到我

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

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

[AHOI2009]中国象棋

题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含两个整数N,M,之间由一个空格隔开. 输出格式: 总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果. 输入输出样例 输入样例#

团队-编程项目 中国象棋-需求分析

需求分析: 1.棋盘和棋子的绘制 2.按照象棋规则对棋子进行布局   3.鼠标响应 : 在对弈中,棋子是必须可以移动的,不然游戏无法进行.因此,鼠标左键点击是必不可少的一部分. 4.棋子的功能分析:  中国象棋中各色的象棋棋子的功能使象棋具有了真正的趣味性,中国象棋的棋子的类型大致分为:帅(将).士.象.马.车.炮.兵(卒)等几个类型.  帅(将):红方中的帅和黑方中的将的功能相同,都是只能在九宫格中进行横向和竖向的移动,每次移动一格,并且不能移动超出九宫格,帅和将不能见面.  士:士在整片棋盘

JavaScript中国象棋程序(0) - 前言

"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.希望通过这个系列,我们对博弈程序的算法有一定的了解.同时,我们也将构建出一个不错的中国象棋程序. JavaScript中国象棋程序系列共有9个部分: 0.JavaScript中国象棋程序(0)- 前言 1.JavaScript中国象棋程序(1)- 界面设计 2.JavaScript中国象棋程序(2)- 校验棋子走法 3.JavaScript中国象棋程序(3)- 电脑自动走棋 4.J

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

dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const in