【动态规划】The Triangle

问题 E: 【动态规划】The Triangle

时间限制: 1 Sec  内存限制: 128 MB
提交: 24  解决: 24
[提交][状态][讨论版]

题目描述

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)

Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

输入

Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.

输出

Your program is to write to standard output. The highest sum is written as an integer.

样例输入

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

样例输出

30解题思路:首先从上往下是i到n-1,从左往右是j到i;  要从上往下加,先看最上面的7,可以加3等于10,可以加8等于15;  然后看第三行当j等于0,只能加到它右上方那个上,当j=i,只能加到左上方那个数上。  当j!=0或i的时候,可以加到左上方,可以加到右上方,但要求最后的和最大,所以要加到和大的那一个上面。  并且加到大的那一个上这一决策对之后的没有影响,无后效性。  状态转移方程为:sum[i][j]=max(sum[i-1][j],sum[i-1][j-1])+a[i][j];  从上到下,从左到右依次遍历,最后一行其中一个数上会有最大值。  便利最后一行sum[i],找出最大值。
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int a[101][101];
    int sum[101][101];
    int n;
    int maxx;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            for(int j=0;j<i+1;j++){
                scanf("%d",&a[i][j]);
            }
        }
        sum[0][0]=a[0][0];
        for(int i=1;i<n;i++){
            for(int j=0;j<i+1;j++){
                if(j==0){
                    sum[i][j]=sum[i-1][j]+a[i][j];
                }
                if(j==i){
                    sum[i][j]=sum[i-1][i-1]+a[i][j];
                }
                sum[i][j]=max(sum[i-1][j],sum[i-1][j-1])+a[i][j];
            }
        }
        maxx=0;
        for(int i=0;i<n;i++){
            if(maxx<sum[n-1][i]){
                maxx=sum[n-1][i];
            }
        }
        printf("%d\n",maxx);
    }
    return 0;
}
时间: 2024-11-05 12:14:20

【动态规划】The Triangle的相关文章

LeetCode之“动态规划”:Triangle

题目链接 题目要求: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle 1 [ 2 [2], 3 [3,4], 4 [6,5,7], 5 [4,1,8,3] 6 ] The minimum path sum from

LeetCode -- Triangle 路径求最小和( 动态规划问题)

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

LeetcodeOJ: Triangle 动态规划

Total Accepted: 31557 Total Submissions: 116793 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is

poj 1163 The Triangle (动态规划)

The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37778   Accepted: 22685 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed

leetcode_120题——Triangle (动态规划)

Triangle Total Accepted: 39052 Total Submissions: 143341My Submissions Question Solution Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following tri

【动态规划初级】动态规划入门 poj1163 The Triangle

动态规划 我在学习算法的时候,就被动态规划搞得是一头雾水,这几日终于是弄明白是怎么回来. 明白之后我才发觉我以前就碰到过一道ACM题,大意是这样的: 有这样形式的一种排列: 例如: 7      3   8    8   1   0  2   7   4   44   5   2   6   5从顶至下找一条路径,使得这条路径上的数字之和最大,而且每一步只能向左下或右下找,直到到最后一行. 比如:第二行的3只能找第三行8或者1. 上面例子的最大一条路径是:7-3-8-7-5;总和30(原题:ht

1163:The Triangle(动态规划)

查看 提交 统计 提示 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 73 88 1 02 7 4 44 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base.

Triangle(动态规划)

题目描述 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ] The minimum path sum from top to bottom is1

nyoj 18 The Triangle 动态规划

和nyoj613(免费馅饼)一样的原理  从下 网上依次遍历 存贮最大值 #include <stdio.h> #include <algorithm> using namespace std; int main() { int n,num[105][105]={0}; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&n