动态规划
数字三角形(递归+备忘录)
//使用动态规划(递归+备忘录)实现
#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 memory[N][N]; //备忘录数组
int dp(int i,int j){//带记忆的递归,备忘录(动态规划的一种变形)
if(memory[i][j]!=0)
return memory[i][j];//使用备忘录
if(i==N)
return data[N][j];
int l=dp(i+1,j);
int r=dp(i+1,j+1);
int max=l>=r?l:r;
memory[i][j]=data[i][j]+max;//memory[i][j]记录dp(i,j)
return memory[i][j];
}
void route(){ //输出dp数组最大数的路径
cout<<data[0][0]; //输出第一数
int j=0;
for(int i=1;i<N;i++){ //查看合成当前数的左右分支
cout<<"-"<<(memory[i][j]>=memory[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;
}
}
main(){
print(data); //原始数据
cout<<dp(0,0)<<endl;
route();
print(memory); //memory数组数据
}

本文介绍如何使用动态规划的递归方法,配合备忘录技术解决数字三角形问题。通过实例代码展示了从原始数据计算最大路径的过程,并展示了备忘录数组的使用和结果。
348

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



