传送门

马走日, 象走田,车走直路炮翻山,小艾同学发明了新玩法,只用炮来布阵棋盘,在一个N*M 的棋盘上,你要放置若干个炮兵,可以是0个,但是不能让炮打到彼此,有多少种方案?

思路:按行dp,思考一下可以发现只需要知道有几列是已经有1个炮,有几列已经有两个炮,和顺序无关。

定义dp[i][j][k]为一共i行,j列有1个炮,k列有两个炮的方案数。

初始化dp[0][0][0]=1,一共有6种转移。不放,在0个炮的列放一个,在1个炮的列放一个,在0个炮的列放两个,在1个炮的列放两个,在0个炮的列放一个&在1个炮的列放一个。

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

const long long MOD=9999973;
int n,m;
long long dp[101][101][101],ans;
inline long long C(long long a)
{
    return a*(a-1)/2;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        ans=0;
        memset(dp,0,sizeof(dp));
        dp[0][0][0]=1;
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<=m; j++)
            {
                for (int k=0; j+k<=m; k++)
                {
                    dp[i+1][j][k]=(dp[i+1][j][k]+dp[i][j][k])%MOD;
                    if (j+k<m)
                    {
                        dp[i+1][j+1][k]=(dp[i+1][j+1][k]+dp[i][j][k]*(m-j-k))%MOD;
                    }
                    if (j>0)
                    {
                        dp[i+1][j-1][k+1]=(dp[i+1][j-1][k+1]+dp[i][j][k]*j)%MOD;
                    }
                    if (j>1)
                    {
                        dp[i+1][j-2][k+2]=(dp[i+1][j-2][k+2]+dp[i][j][k]*C(j))%MOD;
                    }
                    if (m-j-k>=2)
                    {
                        dp[i+1][j+2][k]=(dp[i+1][j+2][k]+dp[i][j][k]*C(m-j-k))%MOD;
                    }
                    if (m-j-k>=1&&j>0)
                    {
                        dp[i+1][j][k+1]=(dp[i+1][j][k+1]+dp[i][j][k]*j*(m-j-k))%MOD;
                    }
                }
            }
        }
        for (int j=0; j<=m; j++)
        {
            for (int k=0; j+k<=m; k++)
            {
                ans=(ans+dp[n][j][k])%MOD;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
Latest posts by 青鸟千秋 (see all)

CF-1025D Recovering BST(区间dp)

传送门 题意:给定n个整数,问是否能生成一棵BST(二分查找树,左子树都比它小,右子树都比它大),并且有边相连的点权的gcd>1。 思路:区间dp,dp[l][...

阅读全文

牛客网暑期多校第五场E room(费用流)

传送门 题意:有n个宿舍,每个宿舍住4个人,给定去年n个宿舍的人员构成,今年n个4人组合的情况,求最少几个人需要搬寝室。 思路:转化为最小费用最大流解...

阅读全文

HDU-4091 Zombie’s Treasure Chest(暴力)

传送门 题意:有一个容量为n的箱子,和无限多的两种珠宝,体积和价值分别是s1,v1,s2,v2,求能装下的最大价值。 思路:直接暴力枚举会TLE,先计算s1 s2的LC...

阅读全文

欢迎留言