洛谷P1006 傳紙條 DP

2022-09-03 04:24:14 字數 3289 閱讀 7119

給出乙個n×m

n×m的矩陣,每個格仔中有權值,求從(1,

1)(1

,1)到(

n,m)

(n,m

)的兩條不相交路徑使得路徑權值之和最大。

很明顯可以把題目看成兩條不相交的路徑從(1,

1)(1

,1)到(

n,m)

(n,m

)。那麼就可以設f[i

][j]

[k][

l]f[

i][j

][k]

[l]表示第一條路走到(i,

j)(i

,j),第二條路走到(k,

l)(k

,l)時的權值最大值。那麼由於可以直接從上和下兩個方向轉移過來,所以就有方程f[

i][j

][k]

[l]=

max(

max(

f[i−

1][j

][k−

1][l

],f[

i][j

−1][

k−1]

[l])

,max

(f[i

−1][

j][k

][l−

1],f

[i][

j−1]

[k][

l−1]

))f[

i][j

][k]

[l]=

max(

max(

f[i−

1][j

][k−

1][l

],f[

i][j

−1][

k−1]

[l])

,max

(f[i

−1][

j][k

][l−

1],f

[i][

j−1]

[k][

l−1]

))+a

[i][

j]+a

[k][

l]−(

(i==

k&j=

=l)?

a[i]

[j]:

0)+a

[i][

j]+a

[k][

l]−(

(i==

k&j=

=l)?

a[i]

[j]:

0)那麼最終答案很明顯就是f[n

][m]

[n][

m]f[

n][m

][n]

[m]。

但是這樣的時空複雜度太不理想了,所以可以考慮剪枝。

我們發現,如果走了sum

sum步,橫座標為x

x,那麼很明顯縱座標就是sum

−xsu

m−x。因為只能往下或右走。那麼我們就可以想到另一種方法:設f[

i][j

][k]

f[i]

[j][

k]表示走了i

i步,兩條路的橫座標分別是jj和k

k時的最大權值和。

這樣我們就可以算出兩條路的縱座標,進而進行轉移。

方程如下:f[

i][j

][k]

=max

(max

(f[i

−1][

j][k

],f[

i−1]

[j−1

][k−

1]),

max(

f[i−

1][j

][k−

1],f

[i−1

][j−

1][k

]))f

[i][

j][k

]=ma

x(ma

x(f[

i−1]

[j][

k],f

[i−1

][j−

1][k

−1])

,max

(f[i

−1][

j][k

−1],

f[i−

1][j

−1][

k]))

+a[j

][i−

j+1]

+a[k

][i−

k+1]

−(j=

=k?a

[j][

i−j+

1]:0

)+a[

j][i

−j+1

]+a[

k][i

−k+1

]−(j

==k?

a[j]

[i−j

+1]:

0)那麼最終答案就是f[n

+m−1

][n]

[n]f

[n+m

−1][

n][n

]。這樣時間複雜度就變成了o(n

3+nm

)o(n

3+nm

)。題外話這道題還可以用網路流做。

摘自

o(n2m2

)o(n

2m2)

#include

#include

using

namespace std;

int a[51]

[51],f[51]

[51][

51][51

],m,x,y,n,k;

intmain()

printf

("%d"

,f[n]

[m][n]

[m])

;return0;

}

o(n

3+nm

)o(n

3+nm

)

#include

#include

#define n 60

using

namespace std;

int n,m,f[n+n]

[n][n]

,a[n]

[n];

intmain()

printf

("%d\n"

,f[n+m-1]

[n][n]);

return0;

}

洛谷 P1006 傳紙條 DP

洛谷 p1006 傳紙條 演算法標籤 動態規劃 dp 小淵和小軒是好朋友也是同班同學,他們在一起總有談不完的話題。一次素質拓展活動中,班上同學安排做成乙個 m 行 n 列的矩陣,而小淵和小軒被安排在矩陣對角線的兩端,因此,他們就無法直接交談了。幸運的是,他們可以通過傳紙條來進行交流。紙條要經由許多同...

洛谷P1006 傳紙條

這是一道四維dp題,注意陣列要開得恰好,不然會爆記憶體。維數越高,每一維上的數字大1的空間代價就越大 因為有限制條件每個數只能訪問一次,所以要判斷兩個人是否走到了同乙個格,以及他們上一步是否在同乙個格。如果兩個人走到了同乙個格,就跳過這次迴圈 如果兩個人上一步在同乙個格,就跳過這種情況,不再比較。動...

洛谷 P1006 傳紙條

本題要找兩條路徑,轉換一下,其實就是從左上角開始找兩條不相交的最大路徑.用f i j k l 表示兩條路徑分別走到 i,j 和 k,l 的時候的最大值.1 include2 include3 4using namespace std 56 int n,m,a 51 54 f 51 51 51 51 ...