数字三角形
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Problem Description
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 //我尽量摆成三角形的样子了
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。
Input
输入的第一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
Output
输出最大的和。
Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
30
读入输入的数,并储存在二维数组中,因为路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数,可知 tri[ i ][ j ] 的下一步只能是 tri[i +1][ j ] 或 tri[ i+1 ][ j+1 ] ,通过递归计算出MaxSum[ i ][ j ];本题将MaxSum[ 1 ][ 1 ]输出即可。
#include<bits/stdc++.h>
using namespace std;
int tri[105][105];
int N;
int MaxSum(int i, int j)
{
if(i == N)
return tri[i][j];
int nSum1 = MaxSum(i+1, j);
int nSum2 = MaxSum(i+1, j+1);
if(nSum1 > nSum2)
return tri[i][j]+nSum1;
return tri[i][j]+nSum2;
}
main()
{
cin>>N;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= i; j++)
cin>>tri[i][j];
cout<<MaxSum(1, 1)<<endl;
}