数塔问题
数塔问题
题目地址:晴问算法 (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;
}

浙公网安备 33010602011771号