time limit: 20 sec memory limit: 128 mb
submit: 936 solved: 679
[submit][status][discuss]
給出乙個網格圖,其中某些格仔有財寶,每次從左上角出發,只能向下或右走。問至少走多少次才能將財寶撿完。此對此問題變形,假設每個格仔中有好多財寶,而每一次經過乙個格仔至多只能撿走一塊財寶,至少走多少次才能把財寶全部撿完。
第一行為正整數t,代表資料組數。
每組資料第一行為正整數n,m代表網格圖有n行m列,接下來n行每行m個非負整數,表示此格仔中財寶數量,0代表沒有
輸出乙個整數,表示至少要走多少次。
13 3
0 1 5
5 0 0
1 0 0
10n<=1000,m<=1000.每個格仔中財寶數不超過10^6
將每乙個財寶抽象成乙個點,這就變成了乙個有向無環圖的最小路徑覆蓋,對於這類問題,我們知道最長反鏈=最小路徑覆蓋,所以求出這張圖的最長反鏈就可以了。對於乙個點,它的左上角是可以到達的,但是右上角不能,所以用f[i][j] 表示以i,j為左下角的矩形的最長反鏈,則f[i][j]=max(f[i][j+1],f[i-1][j],f[i-1][j+1]+a[i][j]).dp一遍就可以了
講的挺好,可惜 就不是我自己寫的
出處:
#include#include#include#include#include#include#define maxn 1010
using namespace std;
int a[maxn][maxn];
long long dp[maxn][maxn];
int n,m,t;
int main()
return 0;
}
bzoj 3997 TJOI2015 組合數學
給出乙個網格圖,其中某些格仔有財寶,每次從左上角出發,只能向下或右走。問至少走多少次才能將財寶撿完。此對此問題變形,假設每個格仔中有好多財寶,而每一次經過乙個格仔至多只能撿走一塊財寶,至少走多少次才能把財寶全部撿完 x 這個點不能順路走到 y 當且僅當 y 在 x 的右上角 答案就是從左下角走到右上...
bzoj3997 TJOI2015 組合數學
我們要求最少路徑覆蓋,可以等價於求最大獨立集。我們要找到乙個權值和最大的點集 s 使得對於點集中任意兩個點 點i 和 點j 使得 點i 不能到 點j 就是要求 點i 嚴格在 點j 的右上方或左下方。用dp可以在 o n 2 內解決。include include include include in...
BZOJ3997 TJOI2015 組合數學
傳送門 根據dilworth定理 偏序集的最小鏈劃分 最長反鏈 對於這題來說,把圖建出來 可以發現圖是乙個dag 題目等價於求最小路徑覆蓋 如果直接用網路流求的話t飛 發現是個偏序問題,所以dag上的最小路徑覆蓋 最長反鏈 即現在要找的東西就是乙個集合s 所有的i,j不可達 求最大權值和 簡單dp一...