在乙個地圖上有n個地窖(n≤200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑,並規定路徑都是單向的,且保證都是小序號地窖指向大序號地窖,也不存在可以從乙個地窖出發經過若干地窖後又回到原來地窖的路徑。某人可以從任意一處開始挖地雷,然後沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使他能挖到最多的地雷。
第一行:地窖的個數;
第二行:為依次每個地窖地雷的個數;
下面若干行:
xi yi //表示從xi可到yi,xi最後一行為"0 0"表示結束。
k1-k2−…−kv //挖地雷的順序 挖到最多的雷。
6
5 10 20 5 4 5
1 21 4
2 43 4
4 54 6
5 60 0
3-4-5-6
34
1 #include 2 #include //整型最大最小值的標頭檔案34
using
namespace
std;56
const
int maxn=210;7
int dp[maxn]={};//
dp[i]:代表從某點出發到終點所挖的最大地雷數
8int g[maxn][maxn]={};//
記錄兩個地窖是否通路
9int p[maxn]={};//
記錄最大地雷數路徑
1011
intmain()
1218
19int
a,b;
20while(true)25
26int max=int_min;
27int
find,temp;
28for(int i=n-1;i>0;i--)
38} 39}
40//
更新使得dp[i]最大:也就是從i出發到結尾的最大地雷數是dp[i]
41 dp[i]+=temp;
42if(dp[i]>max)47}
48//
列印路徑
49 printf("%d"
,find);
50while(p[find]!=0)54
//列印最大值
55 printf("
\n%d\n
",max);
56return0;
57 }
首先算出從每乙個地窖出發到終點所能挖的最大地雷數,此時動態規劃思路要從後面往前面算,因為前面的最大地雷數是取決於與它相連的擁有最大地雷數的地窖。
於是只要計算出與其相連的地窖中,那個的地雷數最大即可。
dp[i] = dp[i] + max{ (i填表的維度是一維;填表範圍是整個陣列(1~n);填表順序是從後往前填時間複雜度:雙重迴圈不難得o(n^2) ;空間複雜度:由於使用了二維陣列儲存了矩陣所以複雜度是o(n^2);
理解:將求最優解的問題劃為一些子問題,子問題的最優解的綜合即為原問題的最優解,一般是根據規律找出遞迴方程並求解。
變的有點難突破,雖然結果是算出來了,但是有些曲折,要花很長時間才能做出來。
演算法第三章作業
1.動態規劃是一種能夠減少重複運算的一種演算法,比較適合原問題能依賴於子問題解得,而子問題也能夠依賴於子子問題解得而出的問題。其次,動態規劃更適合於資料量較多的時候的一種演算法,當資料量沒有到達一定規模的時候,動態規劃演算法不能夠體現出足夠的優勢。如對於揹包問題的貪心演算法和動態規劃法 2.1 單調...
演算法第三章作業
我覺得動態規劃是一種分治法的偽高階型,它將乙個大問題可以分成若干個小問題後,解決子問題,然後將子問題的解插入到乙個表中,用乙個表來記錄所有的已經得到答案的子問題的解,後面就可以發現,無論子問題的解是否被用到,其都在表中,接著求問題便可以節省大量的時間。3 1m i 1 n 1 m i max 1 1...
演算法第三章作業
組員 高珞洋,何汶珊 之前在學習分治法的時候也有將其和動態規劃進行比較,動態規劃能夠解題的根本要求是原問題可以細分成子問題,且原問題的最優解必包含子問題的最優解。為了更明確上述條件,從而保證題目能夠運用動態規劃求解,通常需要兩步操作 明確問題具有最優子結構,並分解問題 找出遞推關係式 狀態轉移方程 ...