POJ 1163數字三角形

2021-09-10 19:49:49 字數 1180 閱讀 8003

所犯錯誤:1、在迴圈中用scanf輸入陣列元素時時,忘記敲&位址符,導致程式停止,改正;

2、在測試時想輸出這個二維陣列的所有元素,雖然用了雙重迴圈,但輸出時只寫了a[i],導致輸出了位址

3、這道題不能用萬能標頭檔案,識別不了,可以用#include

心得:1、

73 8

8 1 0

2 7 4 4

4 5 2 6 5

在輸入像這樣的陣列時,可以用乙個tot計數,tot = 1;在外迴圈中tot++;就可以了

首先,會超時的方法

1、普通的遞迴

所犯錯誤:我輸入時先用了(0,0),而書上開始是(1,1),所以導致錯誤,遞迴很簡單,遞迴第乙個元素,int solve;return a[i][j]+(i == n? :0,max(…))就可以;c語言的賦值語句有返回值,可以返回所附的值;

2、遞推,遞推的複雜度是o(n^2),可以過題;

從下往上遞推,(i = n-1;i >= 1; i–); (j = 1; j <= i;j ++;)這個j<= i是因為那個三角形的原因,所以不能越界;

for( j = 1; j <= n; j++) d[n][j] = a[n][j];//注意遞迴邊界

for( i = n-1; i >= 1; i--)

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

d[i][j] = a[i][j]+max(d[i+1][j],d[i+1][j+1]);

3、動態規劃(公升級版的遞迴)

首先,初始化d陣列,為-1 memset(d,-1, sizeof(d));

初始化為-1的原因,題目中宣告數字三角形中為非負整數;

然後在遞迴中加乙個判斷,如果d[i][j]>= 0,則返回實際值(即d[i][j]已被求出),否則,繼續遞迴,直到求出d[i][j];

我犯了乙個錯誤,在輸出時我輸出了d[1][1],應該輸出solve[1][1],我輸錯了,可能還是不太理解,現在我的理解即為:這是乙個遞迴,從下到上來求,因為普通遞迴會重複計算,所以我先初始化d陣列為-1,如果在使用時為-1,則繼續求,否則,就返回實際值;最後的slove(1,1)即為所求值;

另外,memset包含在cstring的標頭檔案裡,不在algorithm裡

int solve(int i, int j)

POJ 1163 數字三角形

portal dp經典題,ioi94考題,在各大oj上都有 1 include2 include3 include 4 include5 include6 include7 using namespace std 8 define for i,j,k for int i j i k i 9 defi...

poj1163 數字三角形 動態規劃

1.記憶遞迴型 自頂向下 d i j 來存數字 典型的遞迴問題 d r,j 出發,下一步只能走d r 1,j 或者d r 1,j 1 故對於n行的三角形 if r n maxsum r,j d r,j else maxsum r,j max maxsum r 1,j maxsum r 1,j 1 d...

POJ1163 數字三角形 經典DP題目

題目大意 如圖所示的數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值的和最大。圖是我盜的 如果用陣列num j i 表示j行i列的數字,dp j i 表示從該位置向下走的子問題的最優解,整個問題最終就是要求解dp 1 1 就是最頂端的位置的最優...