NOIP2008傳紙條 DP 費用流

2021-09-05 11:39:58 字數 1517 閱讀 4081

在乙個矩形上求兩條不相交的價值最大的路徑

常規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 小軒坐在矩...