Rikka with Nash Equilibrium(hdu 6415 dp)
阿新 • • 發佈:2018-11-25
題目連結:
題意:
將大小為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; }