动态规划:数字三角形(递归+备忘录)

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

动态规划

数字三角形(递归+备忘录)

//使用动态规划(递归+备忘录)实现
#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数组数据 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值