2018暑假杭电多校第九场

1001-Rikka with Nash Equilibrium(hdu 6415)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6415
题意:就是说给一个 N × M 的矩阵 ,如果一个元素满足比他的这一行或者这一列的所有元素都打的话,这个元素就满足“纳什均衡”,问:用 [ 1 , N M ] 来填这个矩阵,满足只有一个元素是“纳什均衡” 的方案数?

其实不是很懂这道题,看网上大佬的博客说是这样: d p [ i ] [ j ] [ k ] 表示有 i j 列,选了 k 个数的方案数
我也不懂为啥 d p [ 1 ] [ 1 ] [ 1 ] 这个初始值要设为 N M ,难道是 N M 个位置随便选一个,所以又 N M 种???
但是这样跟“纳什均衡”有什么关系?

然后后面说就这样 d p 感觉还能理解一点T_T
等题解出来再看看吧

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=85;
LL dp[maxn][maxn][maxn*maxn];//占了i行j列有k个点的方案数 
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        LL N,M,MOD;

        scanf("%lld%lld%lld",&N,&M,&MOD);
        for(int i=1;i<=N;i++)//用memset还超时T_T
        for(int j=1;j<=M;j++)
        for(int k=1;k<=N*M;k++)dp[i][j][k]=0;
        dp[1][1][1]=N*M;
        for(LL k=2;k<=N*M;k++)
        {
            for(LL i=1;i<=N;i++)
            {
                for(LL j=1;j<=M;j++)
                {
                    dp[i][j][k]+=(N-(i-1))*(j)*dp[i-1][j][k-1];//上一次放了i-1行,这一次在剩下的行中选一行 
                    dp[i][j][k]+=(M-(j-1))*(i)*dp[i][j-1][k-1];//同理,上次放了j-1行,这一次在剩下的列中选一列 
                    if(i*j-(k-1)>=1)dp[i][j][k]+=(i*j-(k-1))*dp[i][j][k-1];//要是不想产生新的行或列,那就是放在交点上 
                    if(dp[i][j][k]>MOD)dp[i][j][k]%=MOD;
                }
            }
        }
        printf("%lld\n",dp[N][M][N*M]);
    }
}

猜你喜欢

转载自blog.csdn.net/SwustLpf/article/details/81913262