所犯錯誤: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 就是最頂端的位置的最優...