洛谷P3974 TJOI2015 組合數學

2022-05-16 06:56:20 字數 1259 閱讀 2481

為了提高智商,zjy開始學習組合數學。某一天她解決了這樣乙個問題:給乙個網格圖,其中某些格仔有財寶。每次從左上角出發,只能往右或下走。問至少要走幾次才可能把財寶全撿完。

但是她還不知足,想到了這個問題的乙個變形:假設每個格仔中有好多塊財寶,而每一次經過乙個格仔至多只能撿走一塊財寶,其他條件不變,至少要走幾次才可能把財寶全撿完?

這次她不會做了,你能幫幫她嗎?

第一行為乙個正整數t,表示資料組數

每組資料的第一行是兩個正整數n和m,表示這個網格圖有n行m列。

接下來n行,每行m個非負整數,表示這個格仔中的財寶數量(0表示沒有財寶)。

對於每組資料,輸出乙個整數,表示至少走的次數。

13 3

0 1 5

5 0 0

1 0 0

對於30%的資料,n≤5.m≤5,每個格仔中的財寶數不超過5塊。

對於50%的資料,n≤100,m≤100,每個格仔中的財寶數不超過1000塊

對於100%的資料,n≤1000,m≤1000,每個格仔中的財寶不超過10^6塊

不妨將每乙個財寶都看作是乙個點,那麼所有財寶構成了乙個dag。問題就是求dag的乙個最小路徑覆蓋。接下來,我們需要乙個結論:

dilworth定理:dag的最小鏈覆蓋=最大點獨立集 最小鏈覆蓋指選出最少的鏈(可以重複)使得每個點都在至少一條鏈中

對於乙個矩陣圖(即使我們把每乙個財寶都看成是點,這個圖仍可以看做是矩陣圖),最大獨立集中的任意兩個點一定可以構成左下—右上的關係。不妨考慮dp來解決這個問題。設\(f[i][j]\)表示以點\((i,j)\)為左下角的矩陣中的最大獨立集大小。首先考慮繼承關係,我們有

\[f[i][j]=max(f[i-1][j],f[i][j+1])

\]然後,我們有

\[f[i][j]=max(f[i][j],f[i-1][j+1]+a[i][j])

\]狀態轉移即可。

#include #include #define int long long

#define n 1002

using namespace std;

int t,n,m,i,j,a[n][n],f[n][n];

int read()

return w;

}signed main()

for(i=1;i<=n;i++)

} printf("%lld\n",f[n][1]);

} return 0;

}

洛谷P3974 TJOI2015 組合數學

dilworth定理,把每個位置的每個寶物當做乙個點,可以互相到達的寶物當成鏈,那麼不可互相到達的也就是每個位置的左下角和右上角,就是反鏈,這題就最少鏈覆蓋,也就是求最長反鏈大小,而同乙個位置的不同寶物不能互相到達。這樣直接從左下dp到右上就行了。includeusing namespace std...

P3974 TJOI2015 組合數學

為了提高智商,zjy開始學習組合數學。某一天她解決了這樣乙個問題 給乙個網格圖,其中某些格仔有財寶。每次從左上角出發,只能往右或下走。問至少要走幾次才可能把財寶全撿完。但是她還不知足,想到了這個問題的乙個變形 假設每個格仔中有好多塊財寶,而每一次經過乙個格仔至多只能撿走一塊財寶,其他條件不變,至少要...

洛谷P3976 TJOI2015 旅遊

為了提高智商,zjy 準備去往乙個新世界去旅遊。這個世界的城市布局像一棵樹,每兩座城市之間只有一條路徑可以互達。每座城市都有一種寶石,有一定的 zjy 為了賺取最高利益,她會選擇從 a 城市 再轉手賣到 b 城市。由於zjy買寶石時經常賣萌,因而凡是 zjy 路過的城市,這座城市的寶石 會 讓我們來...