天天看点

算法:数字三角形

题目重述

描述

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

(图1)

图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。

输入

输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。

输出

输出最大的和。

样例输入

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

样例输出

30      
解题思路

用二维数组来存放数字三角形:D[r][j]表示第r行第j个数字(r,j从1开始算)
maxsum(r,j):从D[r][j]到底边的各条路径中,最佳路径的数字之和
问题:求maxsum(1,1)
典型的递归问题
D[r][j]出发,下一步只能走D[r+1][j] 或者D[r+1][j+1]
所以可得出递归模型:

if(r == N)
maxsum(r,j) = D[r][j];
else
MaxSum(r,j) = Max{maxsum(r+1,j),maxsum(r+1,j+1)} + D[r][j];      

源代码:

#include<bits/stdc++.h>
using namespace std;
int MaxSum(int i,int j);//求第i行第j列到底边的最大值
int D[101][101];//第i行第j列的数字
int n;//三角形列数
int main()
{
  cin >> n;
  for(int i=1; i<=n; ++i)
    for(int j=1; j<=i; ++j)
      cin >> D[i][j];
  cout << MaxSum(1,1) << endl;
  return 0;
}
int MaxSum(int i,int j)
{
  if(i == n)
    return D[i][j];
  int x = MaxSum(i+1,j);
  int y = MaxSum(i+1,j+1);
  return max(x,y) + D[i][j];
}