——————我選「挖地雷」拼題如下:
3-3 挖地雷 (25分)
在乙個地圖上有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 #include2#define n 210
3using
namespace
std;
4int
b[n][n];
5int
w[n],p[n];
6int f[n];//
表示挖到地雷最大數
7void print(int k) //
輸出挖地雷的順序 817
intmain()
25int
x,y;
26while(cin>>x>>y)
31int k ,maxx = 0;32
for(int i = 1; i <= n;i++)
3341}42
if(f[i] > maxx)//
計算挖到最多地雷數
4347}48
print(k);
49 cout 50return0;
51 }
1.1根據優子結構性質,列出遞迴方程式:
設w[i]為第i個地窖所藏地雷數。f[i]表示從第i個地窖開始最多可以挖出地雷數
f[i] = max (a[i][j] > 0, i< j <= n)
1.2 給出填表法中表的維度、填表範圍和填表順序。
邊界f[i]=w[i],
表的維度:一維 (f[n])
填表範圍:[1,n]
填表順序:遞增,1~n
1.3 分析該演算法的時間和空間複雜度
時間複雜度o(n^2)
空間複雜度o(n)
主要是清楚最優子結構的含義、分析出重疊子問題。
可以採取自頂向下(備忘錄方法)或者自底向上(dp演算法)的填表方式。
還有一點很重要,特別處理填表時侯的 邊界問題。
所謂邊界問題,就像遞迴中的基例。在填表的時候的」最初的起點「
結對程式設計老好玩了,一頭激昂**,一頭指點江山。
debug也快。
做題也快。
演算法第三章作業
1.動態規劃是一種能夠減少重複運算的一種演算法,比較適合原問題能依賴於子問題解得,而子問題也能夠依賴於子子問題解得而出的問題。其次,動態規劃更適合於資料量較多的時候的一種演算法,當資料量沒有到達一定規模的時候,動態規劃演算法不能夠體現出足夠的優勢。如對於揹包問題的貪心演算法和動態規劃法 2.1 單調...
演算法第三章作業
我覺得動態規劃是一種分治法的偽高階型,它將乙個大問題可以分成若干個小問題後,解決子問題,然後將子問題的解插入到乙個表中,用乙個表來記錄所有的已經得到答案的子問題的解,後面就可以發現,無論子問題的解是否被用到,其都在表中,接著求問題便可以節省大量的時間。3 1m i 1 n 1 m i max 1 1...
演算法第三章作業
組員 高珞洋,何汶珊 之前在學習分治法的時候也有將其和動態規劃進行比較,動態規劃能夠解題的根本要求是原問題可以細分成子問題,且原問題的最優解必包含子問題的最優解。為了更明確上述條件,從而保證題目能夠運用動態規劃求解,通常需要兩步操作 明確問題具有最優子結構,並分解問題 找出遞推關係式 狀態轉移方程 ...