挖地雷
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
#include#include#define maxn 200
using
namespace
std;
bool a[maxn][maxn];//
a[i][j]表示第i個地窖和第j個地窖是否通路
int w[maxn];//
每個地窖的地雷數
int f[maxn];//
f[i]表示從第i個地窖開始挖的最多地雷數
intsuf[maxn];
intmain()
while(cin >> x >>y)
f[n] = w[n];//
初始狀態
for(i = n - 1; i >= 1; i--)
}f[i] = w[i] +l;
suf[i] =k;
}k = 1
;
for(i = 1;i <= n; i++)//
從n個數中找最大值
maxn =f[k];
cout
<< k;//
先輸出起始點
k =suf[k];
while(k != 0
)
cout
<
cout
<< maxn <
return0;
}
1.1 根據最優子結構性質,列出遞迴方程式
f[i] = max (a[i][j] > 0, i< j <= n)
1.2 給出填表法中表的維度、填表範圍和填表順序
1.3 分析該演算法的時間和空間複雜度
時間複雜度o(n^2)
動態規劃演算法通常可以按以下幾個步驟進行:
找出最優解的性質,並刻畫其結構特徵;
遞迴地定義最優值;
自底向上方式計算出各子結構的最優值;
根據計算最優值時得到的資訊,構造最優解。
步驟1~3是動態規劃演算法的基本步驟。若需要最優解,則必須執行第4步,為此還需要在第3步中記錄構造最優解所必需的資訊。
我覺得動態規劃在求值時就是得考慮前者後者的關係,還要看其走向是怎樣的,首先就得把其遞迴方程式求出來,根據遞迴方程確定走向是怎樣的,再填表,最後再根據這些步驟寫成**,但是,雖然能理解這些步驟,可是每到做題的時候就又不會了,不知道怎麼下手,但聽老師講的時候又突然發現,誒,做法怎麼都是一樣的。
結對程式設計這種做法挺好的,既能討論題目,**,又能增進感情,不過經常的都是我同伴比我先做出題來,然後我去理解同伴的做法,她很細心,還會寫很多注釋方便我理解,但是有時我感覺同伴的注釋很難理解,很難說服自己,很難讓老師明白時,我就很著急了,因為同伴明白這意思,但說出來的意思我理解不了,(說服不了我)結果我說的答案都被老師否決了,而同伴只能乾著急,不能為我做些什麼,我內心就有點難受,我咋地就不懂呢,我咋滴拖了後腿呢,但是當老師講了以後我才發現,同伴也理解錯了(雖然答案對了)哈哈哈。
演算法第三章作業
1.動態規劃是一種能夠減少重複運算的一種演算法,比較適合原問題能依賴於子問題解得,而子問題也能夠依賴於子子問題解得而出的問題。其次,動態規劃更適合於資料量較多的時候的一種演算法,當資料量沒有到達一定規模的時候,動態規劃演算法不能夠體現出足夠的優勢。如對於揹包問題的貪心演算法和動態規劃法 2.1 單調...
演算法第三章作業
我覺得動態規劃是一種分治法的偽高階型,它將乙個大問題可以分成若干個小問題後,解決子問題,然後將子問題的解插入到乙個表中,用乙個表來記錄所有的已經得到答案的子問題的解,後面就可以發現,無論子問題的解是否被用到,其都在表中,接著求問題便可以節省大量的時間。3 1m i 1 n 1 m i max 1 1...
演算法第三章作業
組員 高珞洋,何汶珊 之前在學習分治法的時候也有將其和動態規劃進行比較,動態規劃能夠解題的根本要求是原問題可以細分成子問題,且原問題的最優解必包含子問題的最優解。為了更明確上述條件,從而保證題目能夠運用動態規劃求解,通常需要兩步操作 明確問題具有最優子結構,並分解問題 找出遞推關係式 狀態轉移方程 ...