10303 数字三角

10303 数字三角(必做)

时间限制:1000MS  内存限制:65535K
提交次数:117 通过次数:56

题型: 编程题   语言: C++;C;VC;JAVA

Description

问题描述:给定一个由n行数字组成的数字三角形,如下图所示。试用动态规划算法,计算出从三角顶部至底部的一条路径,使得该路径经过的数字总和最大。

注意每个数字只能走向下一行左边或右边的数字,而不能跳跃的走。
         7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5




输入格式

第一行是数字三角的行数n,1<=n<=100。接下来n行是数字三角各行中的数字,所有数字在0~99之间。



输出格式

输出两行,第一行是计算出的最大路径的和值,第二行是该路径上的数字。若有多条路径,靠右的路径优先(即仅仅输出靠右的路径即可,无需多条路径都输出)。


如:
Input: 
5
7
3 8
8 1 6
2 7 4 4
4 5 2 4 5
有两条路径:7-3-8-7-5和7-8-6-4-5都为30,由于后者靠右,因此仅输出后者。
Output: 
30
7 8 6 4 5



输入样例

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

 

#include <iostream>

#include <stdio.h>

using namespace std;

   int n;

int a[10000][10000],b[10000][10000]; //记录数据 、 记录计算的和  1<=n<=100

void findP(){

    for(int i=n;i>=1;i--)

    {

        for(int j=1;j<=i;j++)

        {

            if(j==n) b[i][j]= a[i][j];  //底层节点值和 = 本身节点值

            else {

                if(b[i+1][j]>b[i+1][j+1])  //本节点值和 =取下一层子树值和的最大值 + 本节点值

                b[i][j] = b[i+1][j] + a[i][j];

                else

                b[i][j] = b[i+1][j+1] + a[i][j];

            }

        }

    }

}

int main()

{

   freopen("in.txt","r",stdin);

   cin >>n;

   for(int i=1;i<=n;i++)

    for(int j=1;j<=i;j++)

        cin >> a[i][j];

 

    findP();

    cout<< b[1][1]<<endl;

     cout << a[1][1];

     int temp = b[1][1]-a[1][1];

    for(int i=2;i<=n;i++)

    {

        for(int j=i;j>=1;j--) //靠右的路径优先

        {

 

        if(b[i][j]==temp)  //一一匹配

            {

                cout << " " <<a[i][j];

                temp-=a[i][j];  //更新每一层的匹配值

                break;  //进入下一层循环

            }

 

        }

    }

 

    return 0;

}

 

你可能感兴趣的:(数字)