1. 程式人生 > >Rikka with Nash Equilibrium(hdu 6415 dp)

Rikka with Nash Equilibrium(hdu 6415 dp)

題目連結:

Rikka with Nash Equilibrium

 

題意:

將大小為1 - nm的數填入n*m的矩陣中,問只有有一個納什均衡點的情況數。納什均衡點要求這個數在其所在行列中均為最大值。

 

思路:

因為nm必然大於其餘所有值,所以一定是nm所在位置為納什均衡點。那麼第二大的數只能在nm所在的行列中,同理第三大的數只能在前兩個數所在的行列中。因此,我們可以從nm - 1這個順序去考慮。

定義:dp[i][j][k]:第 i 個數(nm-i+1)放好後有 j 行已經有數字了,有 k 列已經有數字了。

狀態轉移:

行+1:有 k*(n-j+1) 种放法

列+1:有 j*(m-k+1) 种放法

行列數不變:有 jk-i+1 种放法

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;

typedef long long ll;

const int MAX = 1e4 + 10;

int n,m;
ll mod;
int dp[85*85][85][85];

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d%lld",&n,&m,&mod);
        memset(dp,0,sizeof(dp));
        dp[1][1][1]=n*m;
        for(int i=2;i<=n*m;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=m;k++){
                    if(j*k>=i){
                        dp[i][j][k]=(dp[i][j][k]+1ll*dp[i-1][j-1][k]*k*(n-j+1))%mod;
                        dp[i][j][k]=(dp[i][j][k]+1ll*dp[i-1][j][k-1]*j*(m-k+1))%mod;
                        dp[i][j][k]=(dp[i][j][k]+1ll*dp[i-1][j][k]*(j*k-i+1))%mod;
                    }
                }
            }
        }
        printf("%lld\n",dp[n*m][n][m]);
    }
    return 0;
}