首页 > 其他分享 >P2051 [AHOI2009] 中国象棋 题解

P2051 [AHOI2009] 中国象棋 题解

时间:2024-09-19 21:23:25浏览次数:11  
标签:中国象棋 AHOI2009 题解 零个 times 放在 棋子 dp mod

DP好题?
首先确定,每一行/列只能放至多两个棋子,这么少,所以我们的状态肯定和棋子数有关。
由于我们不关注具体的方案数,所以我们不妨只关心对应棋子数量的行/列的数量。同时,由于考虑行和列都是一样的,所以我们不妨用行递推。
所以我们设$ \ dp_{i,j,k} \ $表示当前放到第 \(i\) 行,有 \(j\) 列有1个棋子,有 \(k\) 列有2个棋子下的方案数。
容易写出转移方程如下:
1.若不放棋子
直接继承 \(dp_{i-1,j,k}\)
2.若放一个棋子
①若放在有零个棋子的列
\(dp_{i,j,k} \ += \ dp_{i-1,j-1,k} \ \times(m-j+1-k)\)
放在有零个棋子的列,那么现在和原来相比多了一个有一个棋子的列,所以\(j-1\),而放在任意一个零列都可以,所以要乘\(m-j+1-k\)。
②若放在有一个棋子的列
\(dp_{i,j,k} \ += \ dp_{i-1,j+1,k-1} \ \times(j+1)\)
因为你放在有一个棋子的列,有一个棋子的列的数量就减一了,所以对应转移过来应该是加一,而放在这\(j+1\)列都可以,所以要乘\(j+1\)。
3.若放两个棋子
①若一个放在零个棋子的列,一个放在一个棋子的列
\(dp_{i,j,k} \ += \ dp_{i-1,j,k-1} \ \times(m-j-k+1)\times j\)
这样就会让两个棋子的列多出一个,所以\(k-1\),而放在零个棋子的列有\(m-j-k+1\),放在一个棋子的列有\(j\),所以相乘。
②若两个都放在一个棋子的列
\(dp_{i,j,k} \ += \ dp_{i-1,j+2,k-2} \ \times\) \(j+2 \choose 2\)
j+2选2。
③若两个都放在零个棋子的列
\(dp_{i,j,k} \ += \ dp_{i-1,j-2,k} \ \times\)\(m-j-k+2\choose 2\)
同上。
再多显然不可能了。
讨论结束。
Code

#include<bits/stdc++.h>
using namespace std;
const int mod=9999973;
int n,m;
long long dp[105][105][105];
long long ans;
int main(){
	scanf("%d %d",&n,&m);
	dp[0][0][0]=1;
	for(int i=1;i<=n;++i){
		for(int j=0;j<=m;++j){
			for(int k=0;k<=m-j;++k){
				dp[i][j][k]=dp[i-1][j][k]%mod;
				if(j>=1) dp[i][j][k]+=dp[i-1][j-1][k]*(m-j-k+1)%mod,dp[i][j][k]%=mod;
				if(k>=1) dp[i][j][k]+=dp[i-1][j+1][k-1]*(j+1)%mod,dp[i][j][k]%=mod;
				if(k>=1) dp[i][j][k]+=(dp[i-1][j][k-1]*(m-j-k+1)%mod)*j%mod,dp[i][j][k]%=mod;
				dp[i][j][k]+=dp[i-1][j+2][k-2]*(j+2)*(j+1)/2%mod,dp[i][j][k]%=mod;
				if(j>=2) dp[i][j][k]+=dp[i-1][j-2][k]*(m-j-k+2)*(m-j-k+1)/2%mod,dp[i][j][k]%=mod;
			}
		}
	}
	for(int i=0;i<=m;++i){
		for(int j=0;j<=m;++j) ans+=dp[n][i][j],ans%=mod;
	}
	printf("%lld",ans);
	return 0;
}

标签:中国象棋,AHOI2009,题解,零个,times,放在,棋子,dp,mod
From: https://www.cnblogs.com/mountzhu/p/18419420

相关文章

  • Capital许可使用常见问题解答
    在使用Capital软件的过程中,许多用户可能会遇到关于许可使用的各种问题。为了帮助大家更好地理解和合规使用Capital软件,我们整理了一份常见问题解答,希望能为您提供有价值的参考。一、Capital许可证的类型有哪些?Capital提供多种许可证类型,包括永久许可证、订阅许可证等。永久许可......
  • 【题解】Solution Set - NOIP2024集训Day32 数位 dp
    【题解】SolutionSet-NOIP2024集训Day32数位dphttps://www.becoder.com.cn/contest/5537order:1,3,5,6,2,4「SDOI2013」淘金就是要算前\(k\)大的和。考虑一个位置\((i,j)\)在变化完了之后的金子个数。(也即逆变换。设:\(f^\prime(x)\)表示在\(1\simN\)范围内,数位......
  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • luogu-P10596题解
    简要题意一个有\(N\)个元素的集合有\(2N\)个不同子集(包含空集),现在要在这\(2N\)个集合中取出若干集合(至少一个),使得它们的交集的元素个数为\(K\),求取法的方案数,答案模\(10^9+7\)。数据范围:\(1\leK\leN\le10^6\)。题解我们设\(f(i)\)表示选出子集大小恰好为\(i\)的......
  • 【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
    【洛谷】P11062【MX-X4-T2】「Jason-1」加法的题解题目传送门离CSP初赛只剩两天了,祝各位OIersrp++!!!题解挺有意思的一道思维题,不过比赛的时候没想出来。需要分类讨论两种情况:当a......
  • ICPC2021 沈阳站 M String Problem 题解 | 十种做法一网打尽 , 一道题带你回顾字符串科
    题目传送门题意给定一个字符串,求每个前缀的字典最大序子串。注意到:对于每个前缀$s_{[1,i]}$,字典序最大子串的右边界一定是\(i\)。随着着\(i\)的增大,字典序最大子串的左边界一定是单调不减的。解法不分先后。后缀数组SASA&SAM后缀数组&后缀自动机SA对所有......
  • 和之大题解
    1111...=2^n-1长度为n的都是1的二进制数=2的n次方-1思路:对于每个数只有选或不选(1或0)的二进制,剩余见代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongf[20];intmain(){ freopen("202409C.in","r",stdin); freopen("202409C.out......
  • AGC015D题解
    简要题意给定一个区间\([l,r]\),从中选出若干整数按位或,求可能出现的数的方案数。数据范围:\(1\lel\ler\le2^{60}\)。思路首先对于\([l,r]\)里的数全都满足条件,然后因为是按位或,所以\(l,r\)二进制下的一段前缀就与答案无关可以先去掉。现在我们只需要考虑比\(r\)还要......
  • P4185 [USACO18JAN] MooTube G 题解
    水一篇题解。也是一道并查集的好题,涉及另一个并查集的基本应用,并查集维护连通块(我跟并查集过不去了???)大致题意:给你一棵树,对于每次询问求一个点所在连通块中到达该点的最小路径权值大于给定值的点个数。既然都连通块了,那我们在维护连通块的时候直接不把权值大于K的边加进去,用并查......
  • CF1716C Robot in a Hallway 题解
    容易发现合法路径一定形如:先弯弯曲曲地走(即向下、向右、向上、向右地移动),再直接向右走到头,碰到边界后折回来。所以考虑枚举弯曲地走的部分,这部分的最快时间容易求出。只需考虑快速求出剩余部分的最快时间,设对于第\(i\)第\(j\)列,这个时间为\(f_{i,j}\)。发现移动和等待格子......