動態規劃的進一步理解

2022-08-14 23:36:19 字數 1353 閱讀 8597

動態規劃為了求取全域性最優解,重新建立乙個 dp 陣列,用來儲存當前最優值,直到達到全域性最優值為止。

例如:一塊n*m的矩形土地被分成n*m個小塊,每一小塊有不同數量的硬幣,如果我從這塊土地的左上角出發,到達右下角時,能拾到最多硬幣是多少。(只能往前走或往下走,不能往上或回頭走);

如果我們用貪心演算法,就是看一下前方和下放,哪一塊硬幣最多,就往哪塊走。如果這樣走肯定會誤導我們,就可能會錯過得到最大硬幣數量的方案;

如何才能做到每一步走的都是最優的,想做到這一點肯定是要用到動態規劃求得最優解;換種說法就是說,我們可以把原來的小矩形狀態換為當前狀況的最優解,從而可以求得到達任意乙個小方塊的最優解;

到達任意乙個小方塊的最優解都已經找到了,結果就很自然出來了!

計算到達某個小方塊最優解時,要找到這個解**於什麼地方,找到控制這個解的條件有哪些 。(找到條件)

輸入第一行:n m (1≤n m≤20 0≤xij≤500(i=1,2„.n, j=1,2„,m)

)表示沙漠是乙個n*m的矩形區域

接下來有n行:每行有m個正整數,xi1 xi2 ……xim 表示各位置中的蟲子數(單個空格隔開)

假設「kk」只能向右走或向下走。

輸出輸出有乙個整數, 表示「kk」吃掉最多的蟲子數。

樣例輸入

3 43 1 2 8

5 3 4 6

1 0 2 3

樣例輸出

24

#include#includeusing namespace std ;

int main() ;

int i , j ;

int n , m ;

cin >> n >> m ;

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

for(j = 1 ; j <= m ; j++)

cin >> a[i][j] ;

i = 1 ;

for(j = 1 ; j <= m ; j++)

dp[i][j] = dp[i][j-1] + a[i][j] ;

j = 1 ;

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

dp[i][j] = dp[i-1][j] + a[i][j] ;

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

for(j = 2 ; j <= m ; j++)

if(dp[i-1][j] < dp[i][j-1])

dp[i][j] = dp[i][j-1] + a[i][j] ;

else

dp[i][j] = dp[i-1][j] + a[i][j] ;

cout << dp[n][m] << endl ;

return 0 ;

}

動態規劃的進一步理解

動態規劃為了求取全域性最優解,重新建立乙個 dp 陣列,用來儲存當前最優值,直到達到全域性最優值為止。例如 一塊n m的矩形土地被分成n m個小塊,每一小塊有不同數量的硬幣,如果我從這塊土地的左上角出發,到達右下角時,能拾到最多硬幣是多少。只能往前走或往下走,不能往上或回頭走 如果我們用貪心演算法,...

bufferedReader進一步理解

public static void main string args string mystring system.out.println 請輸入明文 bufferedreader buf new bufferedreader new inputstreamreader system.in try...

進一步理解委託

前面一篇文章介紹了委託的基本知識,接下來就進一步研究一下委託。其實,剛開始覺得委託型別是乙個比較難理解的概念,怎麼也不覺得下面的 assembleiphonehandler 是乙個型別。public delegate void assembleiphonehandler 按照正常的情況,如果我們要建...