相信大家都寫過數字三角形問題,題目很簡單求最大化乙個三角形數塔從上往下走的路徑和。走的規則是:(i,j)號點只能走向(i+1,j)或者(i+1,j+1)。如下圖是乙個數塔,對映到該數塔上行走的規則為:從左上角的點開始,向下走或向右下走直到最底層結束。
求在去掉某乙個點的情況下,數字三角形的最大值。1
3 82 5 0
1 4 3 8
1 4 2 5 0
路徑最大和是1+8+5+4+4 = 22,1+8+5+3+5 = 22或者1+8+0+8+5 = 22。
小s覺得這個問題so easy。於是他提高了點難度,他每次ban掉乙個點(即規定哪個點不能經過),然後詢問你不走該點的最大路徑和。
當然他上乙個詢問被ban掉的點過乙個詢問會恢復(即每次他在原圖的基礎上ban掉乙個點,而不是永久化的修改)。
設f [i
][j]
f[i][j]
f[i][j
]表示從(1,
1)
(1,1)
(1,1)到(i,
j)
(i,j)
(i,j
)所經過的最大路徑,有:f[i
][j]
=max
(f[i
−1][
j−1]
,f[i
−1][
j])+
a[i]
[j
]f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]
f[i][j
]=ma
x(f[
i−1]
[j−1
],f[
i−1]
[j])
+a[i
][j]
設g [i
][j]
g[i][j]
g[i][j
]表示從最後一列走到(i,
j)
(i,j)
(i,j
)所經過的最大路徑,初始化為f[n
][j]
=a[n
][j]
,f[n][j]=a[n][j],
f[n][j
]=a[
n][j
],方程有:g[i
][j]
=max
(g[i
+1][
j],g
[i+1
][j+
1])+
a[i]
][j]
g[i][j]=max(g[i+1][j],g[i+1][j+1])+a[i]][j]
g[i][j
]=ma
x(g[
i+1]
[j],
g[i+
1][j
+1])
+a[i
]][j
]不經過某乙個點,其實就相當於一定經過同一行的其他店,列舉同一行且沒有被ban掉的點(x,
y)
,(x,y),
(x,y),
則一定經過這個點的答案是:f[i
][j]
+g[i
][j]
−a[i
][j]
f[i][j]+g[i][j]-a[i][j]
f[i][j
]+g[
i][j
]−a[
i][j
]因為重複累加了兩邊a[i
][j]
,a[i][j],
a[i][j
],所以需要減去。
在這道題中,如果題目中要求一定不經過某乙個狀態,我們可以考慮一定經過和它同類的狀態來限制。
**如下:
#include
using
namespace std;
int n,m;
int t[
301]
;int v[
301]
;long
long c[
301]
;long
long f[
301]
[90001];
void
sort
(void
)return;}
intmain
(void
)for
(int i=
1;i<=n;
++i)
for(
int j=v-
1;j>=0;
--j)
f[i]
[j]=
min(f[i]
[j+1
], f[i]
[j])
;//f[i][j] 表示 前i件物品 價值至少為j的最小代價
for(
int i=
1,t,m;i<=m;
++i)
return0;
}
動態規劃 數塔問題
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?從頂點出發時到底向左走還是向右走應 取決於是從左走能取到最大值還是從右走能取到最大值,只要左右兩道路徑上的最大值求出來了才能作出決策。同樣的道理下一層的走向又要取決於再下一層上的最大值是否已經求出才能...
動態規劃 數塔問題
從上到下出發,每次只能走到下面相鄰的節點,尋找一條路徑使經過的數值和最大。12 15 10 6 8 2 18 9 5 19 7 10 4 15 動態規劃思路 假設到第i行第j個元素為止的最優解為f i j 則f i j 實際上至於f i 1 j 和f i 1 j 1 有關。include inclu...
數塔問題(動態規劃)
設有乙個三角形的數塔,頂點為根結點,每個結點有乙個整數值。從頂點出發,可以向左走或向右走,如圖所示 若要求從根結點開始,請找出一條路徑,使路徑之和最大,只要輸出路徑的和。輸入第一行為n n 10 表示數塔的層數 從第2行至n 1行,每行有若干個資料,表示數塔中的數值。輸出 輸出路徑和最大的路徑值。樣...