数字三角形
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输入格式
第一行包含整数n,表示数字三角形的层数。
接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。
输出格式
输出一个整数,表示最大的路径数字和。
数据范围
1≤n≤500,
−10000≤三角形中的整数≤10000
输入样例:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
30
常规方法如下:
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std ;
#define MAX 101
int D[MAX][MAX] ;
int n ;
int maxSum[MAX][MAX] ;
int MaxSum(int i , int j ) //求从i,j到底边最优路径
{
if(maxSum[i][j] != -1)//没有被算出来过,避免重复
return maxSum[i][j] ;
if(i == n)
maxSum[i][j] = D[i][j] ;//为底边
else
{
int x = MaxSum(i+1 , j) ;
int y = MaxSum(i+1 , j+1) ;
maxSum[i][j] = max(x , y) + D[i][j] ;//取大的加底边
}
return maxSum[i][j] ;
}
int main()
{
int i ,j ;
cin >> n ;
for( i = 1 ; i <=n ; i ++)
{
for( j = 1 ; j <=i ; j ++)
{
cin >> D[i][j] ;
maxSum[i][j] = -1 ; //初始化
}
}
cout << MaxSum(1 , 1) << endl ;
}
法二:
#include <bits/stdc++.h>
using namespace std ;
int main()
{
int n ;
int a[510][510] ;
cin >> n ;
for (int i = 0 ; i< n ;i ++ )
for (int j = 0 ;j< i ;j ++ )
cin >> a[i][j] ;
for ( int i = n-2 ; i>= 0 ;i -- )
for (int j = 0 ;j <= i ; j ++ )
a[i][j] += max( a[i+1][j] , a[i+1][j+1] ) ;
//从最后一行往上找;
cout << a[0][0] ;
return 0 ;
}