动态规划
数字三角形(循环)
//使用动态规划(循环)实现
#include<iostream>
#define N 5
using namespace std;
int data[N][N]={{9},{12,15},{10,6,8},{2,18,9,5},{19,7,10,4,16}}; //原始数据
int dp[N][N]; //dp数组
void solvedp(){
for(int j=0;j<N;j++){ //将最底一层(n-1)数据读入dp
dp[N-1][j]=data[N-1][j];
}
for(int i=N-2;i>=0;i--){ //从n-2层开始求dp数据,直到最后一层
for(int j=0;j<=i;j++){
int m=dp[i+1][j]>=dp[i+1][j+1]?dp[i+1][j]:dp[i+1][j+1];
dp[i][j]=data[i][j]+m;
}
}
}
void route(){ //输出dp数组最大数的路径
cout<<data[0][0]; //输出第一数
int j=0;
for(int i=1;i<N;i++){ //查看合成当前数的左右分支
cout<<"-"<<(dp[i][j]>=dp[i][j+1]?data[i][j]:data[i][++j]);
}
cout<<endl;
}
void print(int a[][N]){
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++)
cout<<a[i][j]<<"\t";
cout<<endl;
}
}
int main(){
print(data); //原始数据
solvedp(); //求dp数组
cout<<dp[0][0]<<endl; //最大的数
route(); //路径
print(dp); //dp数组数据
return 0;
}

本文介绍如何使用动态规划循环方法求解数字三角形问题,通过逐层计算并更新dp数组,最终找出最大路径和及其路径。步骤包括初始化最底层数据、计算中间层到顶层的dp值,以及输出最大数的路径。
494

被折叠的 条评论
为什么被折叠?



