bzoj3997 TJOI2015 組合數學

2022-05-15 05:57:40 字數 1816 閱讀 6001

我們要求最少路徑覆蓋,可以等價於求最大獨立集。

我們要找到乙個權值和最大的點集$s$,使得對於點集中任意兩個點$點i$和$點j$,使得$點i$不能到$點j$,就是要求$點i$嚴格在$點j$的右上方或左下方。

用dp可以在$o(n^2)$內解決。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include適用於cf,uoj,但不適用於poj

using

namespace

std;

typedef

long

long

ll;typedef

double

db;typedef pair

pii;

typedef complex

cp;#define mmst(a,v) memset(a,v,sizeof(a))

#define mmcy(a,b) memcpy(a,b,sizeof(a))

#define fill(a,l,r,v) fill(a+l,a+r+1,v)

#define re(i,a,b) for(i=(a);i<=(b);i++)

#define red(i,a,b) for(i=(a);i>=(b);i--)

#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)

#define fi first

#define se second

#define m_p(a,b) make_pair(a,b)

#define p_b(a) push_back(a)

#define sf scanf

#define pf printf

#define two(k) (1<

inline t sqr(t x)

template

inline void upmin(t &t,t tmp)

template

inline void upmax(t &t,t tmp)

inline

int sgn(db x)

const db pi=acos(-1.0

);int

gint()

for(;z!=eof && isdigit(z);res=res*10+z-'

0',z=getchar());

return (neg)?-res:res;

}ll gll()

for(;z!=eof && isdigit(z);res=res*10+z-'

0',z=getchar());

return (neg)?-res:res;

}const

int maxn=1000

;int

n,m;

int mp[maxn+10][maxn+10

];ll f[maxn+10][maxn+10

];int

main()

return0;

}

view code

BZOJ 3997 TJOI2015 組合數學

time limit 20 sec memory limit 128 mb submit 936 solved 679 submit status discuss 給出乙個網格圖,其中某些格仔有財寶,每次從左上角出發,只能向下或右走。問至少走多少次才能將財寶撿完。此對此問題變形,假設每個格仔中有好多...

bzoj 3997 TJOI2015 組合數學

給出乙個網格圖,其中某些格仔有財寶,每次從左上角出發,只能向下或右走。問至少走多少次才能將財寶撿完。此對此問題變形,假設每個格仔中有好多財寶,而每一次經過乙個格仔至多只能撿走一塊財寶,至少走多少次才能把財寶全部撿完 x 這個點不能順路走到 y 當且僅當 y 在 x 的右上角 答案就是從左下角走到右上...

BZOJ3997 TJOI2015 組合數學

傳送門 根據dilworth定理 偏序集的最小鏈劃分 最長反鏈 對於這題來說,把圖建出來 可以發現圖是乙個dag 題目等價於求最小路徑覆蓋 如果直接用網路流求的話t飛 發現是個偏序問題,所以dag上的最小路徑覆蓋 最長反鏈 即現在要找的東西就是乙個集合s 所有的i,j不可達 求最大權值和 簡單dp一...