2018寒假集訓 Day2 動態規劃 挖地雷

2022-06-06 09:39:09 字數 1281 閱讀 8766

挖地雷(mine)

在乙個地圖上有n 個地窖(n<=200),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑,並規定路徑都是單向的,且從編號小的地窖通向編號大的地窖。某人可以從任一處開始挖地雷,然後沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使他能挖到最多的地雷。

【輸入格式】

n w1,w2,……wn

x1,y1

x2,y2

…… 0 ,0

【輸出格式】

k1-k2-……-kv

max

【輸入樣例】mine.in

6 5 10 20 5 4 5

1 2

1 4

2 4

3 4

4 5

4 6

5 6

0 0

【輸出樣例】mine.out

3-4-5-6

34 【解題思路】

根據題目中規定路徑都是單向的,且從編號小的地窖通向編號大的地窖,可以確定本題可以使用動態規劃解決。首先思考求解時最後一步會做什麼——選擇最後乙個地窖,挖走其中的地雷。

依據此來推出狀態轉移方程

設f[i]表示以i地窖為結束點能挖到的最大地雷數。

那麼可以寫出f[i]=max(f[j]+a[i])

條件是j小於i且j到i有通道連線。

挖地雷的路線可以在每次求f[i]時記住f[i]的值從**來,記住j值。

最後根據終點走回去即可。

不過我的程式使用了另一種方式,用動態陣列記錄現在走的路線。

【參考程式】

#include

#include

#include

using

namespace

std;

int n,w[250],f[250],map[300][300],ans,x,y,choice;

vector

road[250];

int main()

cin>>x>>y;

while (x!=0&&y!=0)

for (int i=2;i<=n;i++)

if (choice!=-1)

}for (int i=1;i<=n;i++)

if (ans//求最大答案

cout

<0];

for (int i=1;icout

<<"-"

0;}

2018寒假集訓 Day2 動態規劃 維修柵欄

維修柵欄 問題描述 小z最近當上了農場主!不過,還沒有來得及慶祝,一件棘手的問題就擺在了小z的面前。農場的柵欄,由於年久失修,出現了多處破損。柵欄是由n塊木板組成的,每塊木板可能已經損壞也可能沒有損壞。小z知道,維修連續m個木板 這m個木板不一定都是損壞的 的費用是sqrt m 可是,怎樣設計方案才...

寒假訓練 day2

定義 窮竭搜尋是將所有的可能性羅列出來,在其中尋找答案的方法。主要介紹深度優先搜尋和廣度優先搜尋。廣度優先搜尋 bfs 也是搜尋的手段之一。它與深度優先搜尋類似,從某個狀態出發探索所有可以到達的狀態。不同之處在於搜尋的順序,廣度優先搜尋總是先搜尋距離初始狀態近的狀態。總結 廣度優先搜尋與深度優先搜尋...

省隊集訓DAY2

假設我們列舉數列中長度為len的區間,那麼如何判斷兩個數列可以匹配呢?對於提取的數列從小到大排序,從大到小排序,然後兩兩配對,如果所有的都滿足 h 那麼就可以匹配。應該算是貪心吧。這樣做的時間複雜度是o n le n loglen 還是上面的思想,我們如何快速判斷呢?假設我們確定了提取出的區間數列,...