数塔问题

数塔问题

题目地址:晴问算法 (sunnywhy.com)

这是一个非常经典的问题,今天是第一次接触,所使用的方法是递归。

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

数塔就是由一堆数字组成的塔状结构,其中第一行1个数,第二行2个数,第三行3个数,依此类推。每个数都与下一层的左下与右下两个数相连接。这样从塔顶到塔底就可以有很多条路径可以走,现在需要求路径上的数字之和的最大值。

例如在上图中,5->8->12->10与5->3->16->11这两条路径上的数字之和都是35,是所有路径中的最大值。

以上是题目

思路

​ 利用分治的思想,假设有n行,要求这n行数塔的最大值,就得求出n-1行的最大值,以此类推,就可以得到递归的初始和终止条件。

同时假设前i行已经求出一个值,由于数塔的特性,下一步只有两个数可以选择,为了求最大值,所以我们选择两个数中较大的那一个。

max(getMax[i+1][j],getMax[i+1][j+1])

将数塔转化为一个二维数组存储,实现了输入,函数getMax()返回一个int,输出这个函数的返回值。

代码

#include <bits/stdc++.h>
using namespace std;

int n,maxn[25][25];
int getMax(int i,int j){
	if(i==n) return maxn[n][j];
	else
		return max(getMax(i+1,j),getMax(i+1,j+1))+maxn[i][j];	
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<=i;j++)
			cin>>maxn[i][j];
	cout<<getMax(0,0);
	return 0;
}

PS:这道题也可以用DP的角度去思考,后面我学了dp再来写

posted @ 2023-10-17 21:35  胡少辉  阅读(102)  评论(0)    收藏  举报