動態規劃為了求取全域性最優解,重新建立乙個 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 按照正常的情況,如果我們要建...