首页 > 技术文章 > The Triangle(DP-数塔问题)

LJHAHA 2019-03-03 16:47 原文

题目链接:http://poj.org/problem?id=1163

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.
Input
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.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output 

30

就是你身处最三角形的顶端,你可以选择向下紧邻两个的左边或右边走,然后求你所走路标的最大总和

该题错在从第n行开始去进行迭代,但是从倒数第二行开始即可;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[99][99];
int main()
{
    int n,i,j,a[100][100];
    memset(dp,0,sizeof(dp));
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        for(j=1;j<=i;j++){
            scanf("%d",&dp[i][j]);
        }
    }
    for(i=n-1;i>=1;i--){
        for(j=1;j<=i;j++){
            dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
        }
    }
    printf("%d\n",dp[1][1]);
    return 0;
}

 2.计蒜客-捡水果

蒜头在玩一款游戏,他在一个山顶,现在他要下山,山上有许多水果,蒜头每下一个高度就可以捡起一个水果,并且获得水果的能量。山的形状如图所示:

3
1 2
6 2 3
3 5 4 1
这是一个高度为 4 的山,数字代表水果的能量。每次下一个高度,蒜头需要选择是往左下走,还是往右下走。例如:对于上图的情况,蒜头能获得的最大能量为,3+1+6+5=15。现在,蒜头希望你能帮他计算出下山能获得的最大能量。

输入格式
第一行输入一个 n,代表山的高度。(1 < n <= 1000)接下来 n 行,第 i+1 行有 i 个数字,代表水果的能量,水果能量为正整数且不大于 1000。

输出格式
输出一个数字,代表下山一共获得的最大能量,占一行。

样例输入
4
3
1 2
6 2 3
3 5 4 1
样例输出
15

#include<cstdio>
#include<iostream>
using namespace std;
//dp[i][j]记录的是在位置a[i][j]上捡到的水果的最大能量
int main()
{
    int n,dp[110][110];
    int a[110][110];
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++)
            scanf("%d",&a[i][j]);
    }
    /*
    从山底开始遍历,每个位置捡到的水果的能量等于当前位置的能量+max(当前位置左下方的能量,当前位置右下方的能量)
    */
    for(int i=n;i>=1;i--){
        for(int j=1;j<=i;j++){
            dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
        }
    }
    printf("%d\n",dp[1][1]);
    return 0;
}

  

推荐阅读