算法实践:数字三角形

数字三角形

描述

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;
}
发布了129 篇原创文章 · 获赞 148 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/matafeiyanll/article/details/104963561
今日推荐