第十一屆藍橋杯 ——矩陣

2020-10-17 17:00:19

問題描述
把 1 ∼ 2020 放在 2 × 1010 的矩陣裡。

要求同一行中右邊的比左邊大,同一列中下邊的比上邊的大。一共有多少種方案?

答案很大,你只需要給出方案數除以 2020 的餘數即可。

答案提交
這是一道結果填空題,你只需要算出結果後提交即可。
本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。


答案:1340


題解
動態規劃:

f[i][j]

  • 集合所有第一行有 i 個數位,第二行有 j 個數位的方案的集合
  • 屬性數量

決策

  1. 將當前數放在第一行:f[i][j] += f[i - 1][j]
  2. 將當前數放在第二行:f[i][j] += f[i][j - 1]
#include <iostream>
using namespace std;

int f[1020][1020];

int main()
{
    f[0][0] = 1;                                   // 兩行一個數位都不放,也是一種方案
    for (int i = 0; i <= 1010; i ++)
        for (int j = 0; j <= i && j <= 1010; j ++)
        {
            if(i - 1 >= j)                         // 轉移前的狀態也要合法,即第一行的數量不小於第二行的數量
            	f[i][j] += f[i - 1][j] % 2020;
            if(j)
            	f[i][j] += f[i][j - 1] % 2020;
        }
        
    cout << f[1010][1010] << endl;   
    return 0;
}

ps:發現這道題目來源於《演演算法競賽進階指南》,原題是 【楊老師的照相排列】,只不過是超級弱化版,果然多做題才能長見識 😂