動態規劃2 例9 2數字金字塔

2021-10-03 13:06:31 字數 1624 閱讀 2516

例9.2數字金字塔

觀察下面的數字金字塔。寫乙個程式查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。

每一步可以從當前點走到左下方的點也可以到右下方的點

方法一:

從最高點按照規則走到最低點的路徑的最大的權值和,路徑起點終點固定,走法規則明確,可以考慮用搜尋演算法

定義遞迴函式 void dfs(int x,int y, int curr),其中x,y表示當前已從(1,1)走到(x,y),目前已走路徑上的權值和為cur

當x=n時,到達遞迴出口,如果cur比ans大,則把ans更新為cur;

否則向下一行兩個位置行走,即遞迴執行ds(x+1,y,cur+a[x+1][y])和dfs(x+1,y+1,cur+a[x+1][y+1])

#include #includeusing namespace std;

const int maxn=1005;

int a[maxn][maxn],f[maxn][maxn],n,ans;

//遞迴函式

void dfs(int x,int y,int cur)

return ;

}//向下一行兩個位置行走

dfs(x+1,y,cur+a[x+1][y]);

dfs(x+1,y+1,cur+a[x+1][y+1]);

} //主函式

int main()

}//初始化長度

ans=0;

//呼叫遞迴函式

dfs(1,1,a[1][1]);

//列印輸出答案

cout<#include using namespace std;

const int maxn=505;

int a[maxn][maxn],f[maxn][maxn],n;

//遞迴函式

int dfs(int x,int y)else

}return f[x][y];

} //主函式

int main()

}memset(f,-1, sizeof(f));

//呼叫函式

dfs(1,1);

//輸出資料

cout<#includeusing namespace std;

const int maxn=1005;

int a[maxn][maxn],f[maxn][maxn],n;

int main()

}f[1][1]=a[1][1];

//使用迭代法處理

for (int i = 2; i <=n ; ++i) +上一步到這一步的值

f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];}}

int ans=0;

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

//輸出結果

cout<#include using namespace std;

//主函式

int main()

}for (int x = n-1; x>=1 ; x--) else}}

cout<";

y=y+a[x][y][3];

}cout

}

1258 例9 2 數字金字塔

原題鏈結 觀察下面的數字金字塔。寫乙個程式查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以從當前點走到左下方的點也可以到達右下方的點。在上面的樣例中,從13 13 13到8 8 8到26 26 26到15 15 15到24 24 24的路徑產生了最大的和86 86 86。第乙個...

字母金字塔(類同數字金字塔)

問題描述 讓程式要求使用者輸入乙個大寫字母,使用巢狀迴圈產生像下面這樣的金字塔圖案 aaba abcba abcdba abcdecba 演算法分析 每行包括三個部分內容 若干個空格 正序排列的字母 倒序排列的字幕。使用乙個外部迴圈來處理行,在每乙個行中使用三個內部迴圈 乙個處理空格,乙個以公升序列...

數字金字塔

觀察下面的數字金字塔。寫乙個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。7 3 8 8 1 0 2 7 4 4 4 5 2 6 5在上面的樣例中,從7 到 3 到 8 到 7 到 5 的路徑產生了最大 多組輸入資料 第乙個行包含 r...