TJOI2015 組合數學

2022-03-23 02:17:51 字數 1357 閱讀 6125

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

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

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

輸入格式:

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

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

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

輸出格式:

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

輸入樣例#1: 

1

3 30 1 5

5 0 0

1 0 0

輸出樣例#1: 

10

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

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

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

當你做這道題的時候你會發現資料大的超乎你想像(dp都超時)!!!

所以一定會用到數學定理!

但是是什麼數學定理呢?

就是這個定理(不用知道怎麼證明):最長反鏈長度 = 最小鏈覆蓋數

最長反鏈長度 = 最小鏈覆蓋數:

大前提:在有向無環圖中

鏈是乙個點的集合,這個集合中任意兩個元素v、u,要麼v能走到u,要麼u能走到v。

反鏈是乙個點的集合,這個集合中任意兩點誰也不能走到誰。

最長反鏈是反鏈中最長的那個。

那麼最長反鏈怎麼求呢?

另乙個東西叫:最小鏈覆蓋。就是用最少的鏈,經過所有的點至少一次(為什麼不叫最少鏈覆蓋啊囧……)

於是dilwordth定理來了:最長反鏈長度 = 最小鏈覆蓋數

知道這個定理後再結合dp:f[i][j]=第i行第j列的點的最長反鏈長度

由此我們得出了狀態轉移方程:f[i][j]=max(f[i+1][j],max(f[i][j-1],f[i+1][j-1]+a[i][j]))

注意:dp的順序是從下到上、從左到右!!!

#include#includeusing namespace std;

int t,a[1005][1005],f[1005][1005];

int main()

return 0;

}

TJOI2015 組合數學

這個東西一看就是二維偏序嗎?首先考慮把乙個權值為v的點拆成v的相同的點,這v個點相互不可比的。這樣答案變成了最小鏈覆蓋。dilworth定理 最小鏈覆蓋 最大反鏈。乙個點拆成了v的點,因為這v個點互不可比,那這v個點肯定要同時選,所以其實相當求點權和最大的反鏈,這個寫個sb動態規劃就行了。code ...

TJOI2015 組合數學

題目 學習了 rm dilworth 定理,即偏序集的最小全序集劃分等於最大反鏈長度 定理的內容看起來非常自閉,偏序集 全序集和反鏈都是個啥 偏序集其實非常常見,經典的二維偏序 三維偏序其實就是最基本的偏序關係,比如說乙個二元組集合 a 對於 x 1,y 1 x 2,y 2 in a 當 x 1 l...

TJOI2015 組合數學

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