動態規劃的引入2

2021-10-14 01:37:37 字數 2441 閱讀 5618

繼續昨天的練習,今天又做了題單裡的一些題,選了一道比較有意思的題作為本文內容。

題目:挖地雷

題目內容:

在乙個地圖上有nn個地窖(n \le 20)(n≤20),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使某人能挖到最多的地雷。

輸入格式:

有若干行。

第1行只有乙個數字,表示地窖的個數n。

第2行有n個數,分別表示每個地窖中的地雷個數。

第3行至第n+1行表示地窖之間的連線情況:

第3行有n-1個數(00或11),表示第乙個地窖至第2個、第3個、…、第n個地窖有否路徑連線。如第3行為11000…0,則表示第1個地窖至第2個地窖有路徑,至第3個地窖有路徑,至第4個地窖、第5個、…、第n個地窖沒有路徑。

第4行有n-2個數,表示第二個地窖至第3個、第4個、…、第n個地窖有否路徑連線。

… …第n+1行有1個數,表示第n-1個地窖至第n個地窖有否路徑連線。(為0表示沒有路徑,為1表示有路徑)。

輸出格式:

有兩行,第一行表示挖得最多地雷時的挖地雷的順序,各地窖序號間以乙個空格分隔,不得有多餘的空格。第二行只有乙個數,表示能挖到的最多地雷數。

輸入輸出樣例:輸入5

10 8 4 7 6

1 1 1 0

0 0 0

1 11

輸出1 3 4 5

27解題過程:

每個地窖的屬性比較多,所以用了乙個結構體來儲存,minenum表示該地窖藏得地雷數目,minemax表示通往當前地窖的地雷數和最大的那條路的地雷數(算上本身),pre是在地雷數最多的那條路該結點的前驅結點,link儲存通往該地窖的所有前驅結點。

struct

cellar[

100]

;

在通往當前地窖的地雷數和最大的那條路的地雷數 與 前乙個地窖的dp值 做選擇,這裡順便還儲存了前驅結點,方便之後輸出路徑,**如下:

voiddp(

)}cellar[i]

.minemax +

= cellar[i]

.minenum;

cellar[i]

.minedp =

max(cellar[i]

.minemax,cellar[i-1]

.minedp);}

}

void

showway

(int x)

else

showway

(cellar[x]

.pre)

; cout << x <<

" ";

}

全部**:

#include

using

namespace std;

//通往當前地窖的地雷數和最大的那條路的地雷數 與 前乙個地窖的dp值 做選擇

struct

cellar[

100]

;int cellarnum;

void

init()

for(

int i=

1;i < cellarnum;i++)}

cellar[1]

.minedp = cellar[1]

.minenum;

cellar[1]

.minemax = cellar[1]

.minenum;

cellar[1]

.pre =0;

}void

showway

(int x)

else

showway

(cellar[x]

.pre)

; cout << x <<

" ";

}voiddp(

)}cellar[i]

.minemax +

= cellar[i]

.minenum;

cellar[i]

.minedp =

max(cellar[i]

.minemax,cellar[i-1]

.minedp);}

}int

main()

} cout << cellar[cellarnum]

.minedp;

}

心得:

在題解裡發現的用遞迴來輸出路徑的方法很有意思,很多題目應該都可以用到。

動態規劃的引入1

之前學習過一段時間的動態規劃,但掌握的不夠牢固,實際做題時還是不能靈活的運用,所以打算在寒假對這部分知識進行學習和鞏固,按照洛谷的提單分為五個部分進行學習 1.動態規劃的引入 2.線性狀態動態規劃 3.區間與環形動態規劃 4.樹與圖上的動態規劃 5.狀態壓縮動態規劃 本文題目選自第一部分的練習內容 ...

動態規劃2

動態規劃是研究一類最優化問題的方法,在經濟 工程技術 企業管理 工農業生產及軍事等領域中都有廣泛的應用。近年來,在acm icpc中,使用動態規劃 或部分應用動態規劃思維 求解的題不僅常見,而且形式也多種多樣。而在與此相近的各類資訊學競賽中,應用動態規劃解題已經成為一種趨勢,這和動態規劃的優勢不無關...

動態規劃(2)

題目輸入格式 第1行 兩個數字r,c 1 r,c 100 表示矩陣的行列。第2.r 1行 每行c個數,表示這個矩陣。輸出格式 僅一行 輸出1個整數,表示可以滑行的最大長度。樣例輸入 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 ...