我們要求最少路徑覆蓋,可以等價於求最大獨立集。
我們要找到乙個權值和最大的點集$s$,使得對於點集中任意兩個點$點i$和$點j$,使得$點i$不能到$點j$,就是要求$點i$嚴格在$點j$的右上方或左下方。
用dp可以在$o(n^2)$內解決。
#include#includeview code#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;
}
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一...