1. 程式人生 > >2018暑假杭電多校第九場

2018暑假杭電多校第九場

1001-Rikka with Nash Equilibrium(hdu 6415)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6415
題意:就是說給一個N×M 的矩陣 ,如果一個元素滿足比他的這一行或者這一列的所有元素都打的話,這個元素就滿足“納什均衡”,問:用[1,NM]來填這個矩陣,滿足只有一個元素是“納什均衡” 的方案數?

其實不是很懂這道題,看網上大佬的部落格說是這樣:dp[i][j][k] 表示有 ij 列,選了 k 個數的方案數
我也不懂為啥 dp[1

][1][1] 這個初始值要設為 NM,難道是 NM 個位置隨便選一個,所以又 NM 種???
但是這樣跟“納什均衡”有什麼關係?

然後後面說就這樣 dp 感覺還能理解一點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]); } }