[DP]HDU6415(2018多校訓練賽第九場 Problem A) Rikka with Nash Equilibrium 題解
題目大意
給出一個 n∗m n ∗ m <script type="math/tex" id="MathJax-Element-3">n*m</script>的網格,現要在網格中填入1,2,……, n∗m n ∗ m <script type="math/tex" id="MathJax-Element-4">n*m</script>,如果一個格子數比同行同列的數都大,那麼就說這個格子佔領了這行這列,求只有一個格子佔滿一行一列的方案數。
解題報告
因為 n∗m n ∗ m <script type="math/tex" id="MathJax-Element-5">n*m</script>是最大的,所以他肯定佔領一行一列,所以這樣的話我們就必須保證其他的數都不能同時佔領一行一列了。
如果我們隨便把 n∗m n ∗ m <script type="math/tex" id="MathJax-Element-6">n*m</script>放在某個格子上,接下來放 n∗m−1 n ∗ m − 1 <script type="math/tex" id="MathJax-Element-7">n*m-1</script>,那麼為了保證”其他數不能佔領“,那麼它只能放在 n∗m n ∗ m <script type="math/tex" id="MathJax-Element-8">n*m</script>所在行列上。再往下處理也是一樣,但是除了前面比它大的數所在行列之外,在交叉點上也可以放,同時被兩個大數壓制。
那麼就可以選擇從大到小放,根據前面的策略,發現要滿足題目限制,有三種可行的方案。
1.放在已覆蓋的一行上,只佔領一列。
2.放在已覆蓋的一列上,只佔領一行。
3.放在已覆蓋的一行一列交點處,沒有佔領。
考慮DP, f[i][j][k] f [ i ] [ j ] [ k ] <script type="math/tex" id="MathJax-Element-9">f[i][j][k]</script>表示已覆蓋 i i <script type="math/tex" id="MathJax-Element-10">i</script>行 j j <script type="math/tex" id="MathJax-Element-11">j</script>列,還有 k k <script type="math/tex" id="MathJax-Element-12">k</script>個已覆蓋的交點有空位的方案數,初始 f[1][1][0]=n∗m f [ 1 ] [ 1 ] [ 0 ] = n ∗ m <script type="math/tex" id="MathJax-Element-13">f[1][1][0]=n*m</script>, 答案就是 f[n][m][0] f [ n ] [ m ] [ 0 ] <script type="math/tex" id="MathJax-Element-14">f[n][m][0]</script>。
三種方案轉移一下……還是見程式碼吧。
示例程式碼
#include<cstdio>
#define LL long long
using namespace std;
int tst,n,m,tt;
LL f[85][85][6405];
int main()
{
freopen("nash.in","r",stdin);
freopen("nash.out","w",stdout);
scanf("%d",&tst);
while (tst--){
scanf("%d%d%d",&n,&m,&tt);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=0;k<=i*j;k++) f[i][j][k]=0;
f[1][1][0]=n*m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=i*j;k>=0;k--)
if (f[i][j][k]){
if (i<n) f[i+1][j][k+j-1]=(f[i+1][j][k+j-1]+f[i][j][k]*((n-i)*j))%tt;
if (j<m) f[i][j+1][k+i-1]=(f[i][j+1][k+i-1]+f[i][j][k]*((m-j)*i))%tt;
if (k) f[i][j][k-1]=(f[i][j][k-1]+f[i][j][k]*k)%tt;
}
printf("%lld\n",f[n][m][0]);
}
return 0;
}
相關文章
- HDU6415:Rikka with Nash Equilibrium(dp)UI
- 【記憶優化搜尋/dp】HDU - 6415 - 杭電多校第九場 - Rikka with Nash Equilibrium優化UI
- 【dp+組合數學】hdu 2018 多校第九場 1001 Rikka with Nash Equilibrium hdu 6415UI
- HDU 6415 Rikka with Nash Equilibrium (DP)UI
- HDU-6415 Rikka with Nash Equilibrium (DP/找規律)UI
- hdu 6415 Rikka with Nash EquilibriumUI
- 2018 Multi-University Training Contest 9----hdu 6415 Rikka with Nash EquilibriumAIUI
- 2020牛客暑期多校訓練營(第三場)D Points Construction Problem 構造思維題Struct
- HDU5831(2016多校第八場)———Rikka with Parenthesis II(水題)
- 4.17訓練賽
- 牛客網暑期ACM多校訓練營(第三場)C Shuffle Cards(splay)ACM
- 看雪CTF.TSRC 2018 團隊賽 第九題『諜戰』 解題思路
- 程式設計謎題:提升你解決問題的訓練場程式設計
- HDU4965Fast Matrix Calculation(2014多校第九場)AST
- 哈爾濱理工大學3-31校賽模擬賽第一場題解
- 2020牛客NOIP賽前訓練營-普及組第一場牛牛的跳跳棋題解
- 2018年第九屆藍橋杯省賽試題及詳解(Java本科A組)Java
- acm訓練題ACM
- 如何訓練解決問題的能力?
- 2018年第九屆藍橋杯省賽試題及詳解(Java本科B組)Java
- 19_03_28校內訓練[相似字串]字串
- 【專題訓練】字串字串
- 「暑期訓練」「基礎DP」 Common Subsequence (POJ-1458)
- Wenet多機多卡分散式訓練分散式
- 2018 徐州網路賽 G 題解
- 「暑期訓練」「基礎DP」免費餡餅(HDU-1176)
- 定積分例題訓練
- 「暑期訓練」「基礎DP」 Monkey and Banana (HDU-1069)NaN
- PyTorch 模型訓練實⽤教程(程式碼訓練步驟講解)PyTorch模型
- hdu 4089||2011年北京現場賽I題 概率dp(公式不好推)公式
- [Offer收割]程式設計練習賽2 hihocoder 1272 買零食 (DFS 或 dp 水題)程式設計
- 2018天梯賽、藍橋杯、(CCPC省賽、邀請賽、ICPC邀請賽)校內選拔賽反思總結!
- 2019KCTF 晉級賽Q1 | 第九題點評及解題思路
- 演算法競賽入門經典訓練指南 pdf演算法
- 校賽總結
- 2018第九屆藍橋杯省賽C++B組【第四題:測試次數】C++
- 藍橋杯 演算法訓練 K好數(Java解題)演算法Java
- 如何使用screen解決ssh斷連訓練停止的問題