DP入門題 數塔問題 poj1163

2021-07-08 11:56:37 字數 985 閱讀 3998

做了10來道dp題再做這個數塔問題明顯上手,不僅寫的快,一次ac,還用了兩種方法。由此看來深入淺出不是沒有道理啊,哈哈~~

數塔問題的狀態轉移方程很容易得到,我是從上往下想的(即遞推的思想),這裡說一下經常看到的兩種dp的寫法,一種是用遞推的方式,它的要求是每一次求的這個狀態,它計算肯定是由前面已經算出來的狀態得到的,比較容易實現,但是不是每一道題都那麼容易想出,另一種是記憶化搜尋的方式, 即我算出乙個結果就儲存,以便後來使用(比如什麼初始化陣列為負,算出結果就儲存,一旦發現陣列為正說明計算過了,直接使用)。

這裡我都是用的遞推的方式,只不過第二種方式取了個巧,因為我是從1~n而dp[i-1][j-1]的j-1是可能到0的,但是dp[i-1][0]肯定是沒有dp[i-1][1]大的(dp[i-1][0]初始化為0,memset)

#include #include int max(int a,int b)

int main()

dp[1][1]=a[1][1];

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

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

ans=-99999;

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

ans=max(ans,dp[n][i]);//在最後一行找出較大的那個數

printf("%d\n",ans);

return 0;

}

#include #include int max(int a,int b)

int main()

變種題:lightoj 1004

#include #include __int64 max(__int64 a,__int64 b)

__int64 s[300][300];

__int64 dp[300][300];

int main()

return 0;

}

DP數塔問題

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?有一組測試樣例,測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間 0,99 內。output 對於每個測試例項,輸出...

DP經典問題,數塔

在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?dp問題一般都是從後向前,後文有從前向後的動態規劃 分析 因為要找到最大值的連線,我們可以從倒數第二行開始,在2時可以選擇19和7,...

DP問題之數塔問題

問題描述 考慮下面的數字金字塔,寫乙個程式來計算從最高點開始,在底部任意處結束經過的數字和最大,每一步可以走到左下和右下的點。73 8 8 1 0 2 7 4 4 4 5 2 6 5 變形後 3 8 8 1 0 2 7 4 4 4 5 2 6 5 問題分析 可以先對金字塔進行變形,如上。對於數字金字...