数字三角形
描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图1)
图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
注意:路径上的每一步只能从一个数走到正下方和右下方的那个数。
输入
输入的是一行是一个整数N (1 < N <= 1000),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
输出
输出最大的和
样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
30
难度
中等,递归分治,动态规划
解法
TOP TO BOTTOM
从某个d( r , j )出发,下一步只能走d ( r+1 , j )或d( r+1 , j+1 )。如果走d ( r+1 , j ),那么得到的MaxSum( r , j )就是MaxSum( r+1 , j )+d( r , j );如果走d ( r+1 , j +1),那么得到的MaxSum( r , j )就是MaxSum( r+1 , j +1)+d( r , j )。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX_NUM 1000
int d[MAX_NUM+10][MAX_NUM+10];
int N;
int MaxSum(int r,int j) //递归求解最大路径和
{
if(r==N)
return d[r][j];
int sum1=MaxSum(r+1,j);
int sum2=MaxSum(r+1,j+1);
if(sum1>sum2)
return sum1+d[r][j];
return sum2+d[r][j];
}
int main()
{
int m;
cin>>N;
for(int i=1;i<=N;i++)
for(int j=1;j<=i;j++)
cin>>d[i][j];
cout<<MaxSum(1,1);
return 0;
}
BOTTOM TO TOP
自底向上求MaxPath , MaxPath [i] [j]= max(MaxPath [i+1] [j],MaxPath [i+1] [j+1]) + d[i] [j]
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX_NUM 1000
int d[MAX_NUM+10][MAX_NUM+10];
int Maxpath[MAX_NUM+10][MAX_NUM+10] = {0};
int N;
void MaxSum() //递归求解最大路径和
{
int i = N;
for(;i>0;i--)
for(int k=1;k<=i;k++)
Maxpath[i][k] = max(Maxpath[i+1][k],Maxpath[i+1][k+1])+d[i][k];
return;
}
int main()
{
int m;
cin>>N;
for(int i=1;i<=N;i++)
for(int j=1;j<=i;j++)
cin>>d[i][j];
MaxSum();
cout<<Maxpath[1][1];
return 0;
}