• 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题
    (f[i][j][k])表示前i行有j列放了一个炮,k列放了两个炮
    每行最多放两个,分类讨论转移,是放在了没有炮的行还是有炮的,一个还是两个,全都放还是分别不同。
    见代码

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
    #define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
    using namespace std;
    const int maxn = 105,maxm = 100005,INF = 1000000000,P = 9999973;
    inline int read(){
    	int out = 0,flag = 1; char c = getchar();
    	while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
    	while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - '0'; c = getchar();}
    	return out * flag;
    }
    int f[maxn][maxn][maxn],n,m;
    int C(int x) {return x * (x - 1) >> 1;}
    int main(){
    	n = read(); m = read();
    	f[0][0][0] = 1;
    	for (int i = 1; i <= n; i++)
    		for (int j = 0; j <= m; j++)
    			for (int k = 0; j + k <= m; k++){
    				f[i][j][k] = f[i - 1][j][k];
    				int& F = f[i][j][k];
    				if (j) F += (LL)(m - j - k + 1) * f[i - 1][j - 1][k] % P,F %= P;
    				if (j > 1) F += (LL)C(m - j - k + 2) * f[i - 1][j - 2][k] % P,F %= P;
    				if (k) F += (LL)(j + 1) * f[i - 1][j + 1][k - 1] % P,F %= P;
    				if (k > 1) F += (LL)C(j + 2) * f[i - 1][j + 2][k - 2] % P,F %= P;
    				if (k) F += (LL)j * (m - j - k + 1) % P * f[i - 1][j][k - 1] % P,F %= P;
    			}
    	int ans = 0;
    	for (int j = 0; j <= m; j++)
    		for (int k = 0; j + k <= m; k++)
    			ans = (ans + f[n][j][k]) % P;
    	printf("%d",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    习题训练五 题解
    习题训练四 题解
    习题训练三 题解
    习题训练二 题解
    牛客小白月赛25 解题+补题报告
    习题训练一 题解
    2020.5.10 个人rating赛 解题+补题报告
    2020.4.19 个人rating赛 解题+补题报告
    2020.4.11 组队rating赛 解题+补题报告
    How to Unlock Nissan Micra Smart Key by VVDI Key Tool Plus?
  • 原文地址:https://www.cnblogs.com/Mychael/p/8318632.html
Copyright © 2020-2023  润新知