積分:題目:
設有乙個三角形的數塔,頂點為根結點,每個結點有乙個整數值。從頂點出發,可以向左走或向右走,請找出一條路徑,使路徑之和最大,只要輸出路徑的和。
解析:這道題
是很經典的動態規劃
有的同志可能會問
用別的方法不好嗎
下面我給大家來看看
別的方法的
翻車現場!!!∑(゚д゚ノ)ノ
(1)深度優先搜尋(窮舉):從根結點開始,將所有可能的路徑求和,找出最大值。
n=1,p=1
n=2,p=2
n=3,p=4
……n=k,p=2^(k-1)
例如:n=50,p=2^49=500萬億條路徑。
演算法複雜度:o(2^(n-1))
(2)深度優先搜尋(遞迴):
存在的問題:出現重複子問題,需要解決重複計算問題。
(3)貪心演算法:
根據貪心演算法法,得出的解為:13-11-21;而實際上最優解應為:13-8-40。
貪心演算法往往得不到最優解。
不忍直視!!!∑(゚д゚ノ)ノ
動態規劃的題目
一般有兩點
1、重複子問題
2、最優子結構
這道題完全符合以上兩點
在輸入的時候
是這樣輸入的:
1311 8
12 7 26
6 14 15 8
12 7 13 24 11
從倒數第二行
往第一行推
每一行從左到右推
每乙個都加等於這個數下面的值或右下角的值中大的那乙個
算到最後
最上面的值就是最大的
下面附上**
**:
#include
#include
#include
#include
using
namespace std;
int n,a[
1000][
1000
],b[
1000][
1000];
intmain()
for(
int i=n-
1;i>=
1;i--
)for
(int j=
1;j<=i;j++
) cout<
[1];
return0;
}
題目:
卡卡西和小朋友們做完了燒腦的數字遊戲, 決定放鬆一下,他們來到了萬達樂園, 樂園中有很多的遊玩專案, 每玩乙個專案就能獲取一定的體驗積分, 不同的專案產生不同的體驗積分, 假設樂園所有的遊樂專案正好排成一排, 並且遊客們不能遊玩任意相鄰的兩個專案,那麼卡卡西如何挑選遊玩專案, 使得這次萬達行他能獲得最多的體驗積分值呢。
解析:這道題
十分的像01揹包
這道題的重點只有乙個
玩還是不玩
我們可以將答案放在f陣列裡
一點一點假設
假設只玩第乙個、假設只玩第乙個和第二個、假設只玩第乙個和第二個和第三個
一點一點進行計算
每放乙個之前我們都要思考
如果放了f[i]
就只能放f[i-2]
否則就放f[i-1]
這樣一點一點的算
最終就會算出最大值
所以這道題的dp方程是
f[i]
=max
(f[i-1]
,f[i-2]
+f[i]
);
下面附上**:
**:
#include
#include
#include
#include
using
namespace std;
int a[
1000
],n,f[
1000];
intmain()
拜拜!!! 動態規劃 數塔問題
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?從頂點出發時到底向左走還是向右走應 取決於是從左走能取到最大值還是從右走能取到最大值,只要左右兩道路徑上的最大值求出來了才能作出決策。同樣的道理下一層的走向又要取決於再下一層上的最大值是否已經求出才能...
動態規劃 數塔問題
從上到下出發,每次只能走到下面相鄰的節點,尋找一條路徑使經過的數值和最大。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行,每行有若干個資料,表示數塔中的數值。輸出 輸出路徑和最大的路徑值。樣...