在乙個矩形上求兩條不相交的價值最大的路徑
常規dp題,略過
這道題可以作為費用流入門題,可以很好理解費用流的用途
1、找出方案可行:考慮最大流建圖方法
首先因為要找不想交的兩條路徑,我們可以限制每個點只被選擇一次,對於點的限制一般是拆點的套路。
將乙個點i拆分為2個點,i和i』並且連邊權為1,這樣就可以限制這個點只被選擇一次,不過源點和匯點(左上角、右下角)的兩個點可以選擇兩次所以邊權為2
然後i』和下方的點j連邊,i』和右邊的點i連邊,邊權都為1,表示可以向下走,和向右走。邊權為1表示只能走一次
2、考慮費用賦權
對於原圖,只有點權。所以將i和i』之間的邊賦權值為點權,其他的費用為0
最後跑一次費用流即可
#include
using
namespace std;
#define in read()
#define ll long long
#define db double
#define pc(x) putchar(x)
#define gc getchar()
const
int inf=
0x7fffffff
;const
int mod =
1e9+7;
inline
intread()
const
int n=
1e4+10;
struct edgee[n*10]
;int cnt=
1,first[n]
,ans;
int s,t,n,m;
inline
void
add(
int u,
int v,
int c,
int f)
inline
void
ins(
int u,
int v,
int c,
int f)
namespace d}}
}return dis[s]!=-
1;}int
dfs(
int x,
int t,
int f,
int&ans)
}return used;
}int
flow
(int s,
int t,
int&ans)
}return ret;}}
inline
int idx (
int x,
int y)
int dx=
;int dy=
;int
main()
}int ans=
0;s=
1,t=
2*n*m;
d::flow
(s,t,ans)
; cout
}
Noip2008傳紙條題解
仍是多執行緒dp,這次直接斜著讀入,方便寫dp方程。以6 4的圖為例,讀入順序如表 從左至右,從上至下,不用管那些0 for int i 1 i m i for int j 1 j n j read map i j 1 i 00 0000 0000 00 1,4 2,4 3,4 4,4 5,4 6,...
NOIP2008 傳紙條(DP及滾動陣列優化)
傳送門 這道題有好多好多種做法呀 先說一下最暴力的,o n 4的做法 我們相當於要找兩條從左上到右下的路,使路上的數字和最大。所以其實路徑從 開始走並不重要,我們就直接假設全部是從左上出發的好啦。設dp i j p q 表示第一條路列舉到點 i,j 第二條路列舉到點 p,q 時,當前能取到的最大值。...
動態規劃入門 NOIP2008 傳紙條
小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個m行n列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同學傳到對方手裡,小淵坐在矩陣的左上角,座標 1,1 小軒坐在矩...