动态规划:数字三角形(循环)

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

动态规划

数字三角形(循环)

//使用动态规划(循环)实现
#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;
} 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值