做了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 問題分析 可以先對金字塔進行變形,如上。對於數字金字...