例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...