信息学奥赛一本通 1258:【例9.2】数字金字塔
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通 1258:【例9.2】数字金字塔
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【題目鏈接】
ybt 1258:【例9.2】數(shù)字金字塔
【題目考點】
1. 記憶化搜索
2. 動態(tài)規(guī)劃基本型
【解題思路】
思路1:一般深搜(非正確解)
每到一個位置,更新加和,向左下,右下兩個方向搜索。
搜索到最后一行,判斷當(dāng)前加和是否大于最大加和,更新最大加和。
該搜索過程實際上對很多問題重復(fù)計算了很多次,因而時間復(fù)雜度較高。只能解決小規(guī)模的問題,如果提交該代碼的話,必定超時!
思路2:記憶化遞歸
思路3:順推法
思路4:逆推法
【題解代碼】
解法1:記憶化遞歸
設(shè)二維數(shù)組sumMx,sumMx[i][j]記錄i,j位置到底層的最大加和。
- 遞歸問題為:求第i,j位置到底層的最大加和。
- 遞歸函數(shù)中:
- 如果在sumMx中已經(jīng)記錄了i,j位置到底層的最大加和,則直接返回該值。
- 如果沒有記錄,那么最大加和為:“該位置左下方位置到底層的最大加和”,和“該位置右下方位置到底層的最大加和”中的最大值,加上該位置的值。而后記錄該值。
i,j的左下方位置:i+1,j,右下方位置:i+1,j+1,所以該表達式為:
sumMx[i][j] = a[i][j] + max(dfs(i+1, j), dfs(i+1, j+1));
- 遞歸退出條件:到達底層
解法2:順推法
- 設(shè)二維數(shù)組sumMx,sumMx[i][j]記錄從1,1位置到i,j位置的最大加和
- 1,1到i,j位置的加和,為1,1到i,j位置左上右上兩個位置的加和的最大值,加上i,j位置的值。
i,j左上位置為i-1,j-1;右上位置為i-1,j
所以有:sumMx[i][j] = max(sumMx[i-1][j-1], sumMx[i-1][j]) + a[i][j];
初始情況sumMx[1][1] = a[1][1];
以此可以推出從1,1到底層各位置的最大加和,取其中最大值即可。
解法3:逆推法
設(shè)數(shù)組sumMx[i][j]表示從底層某位置到i,j的最大加和。
從底層向上層遞推。
總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1258:【例9.2】数字金字塔的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(2053:【例3.3】
- 下一篇: 信息学奥赛一本通(2046:【例5.15