POJ 1163 The Triangle

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

题意
给一个数字三角形,问从最上面走到最下一层的最大值是多少。

分析
每个格子只能往下往右走。定义状态dp[i][j]为走到格子(i,j)获得的最大值,那么dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])。最后统计dp[n][i]
的最大值即为答案。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include <queue>
#include <vector>
#include<bitset>
#include<map>
#include<deque>
using namespace std;
typedef long long LL;
const int maxn = 5e4+5;
const int mod = 77200211+233;
typedef pair<int,int> pii;
#define X first
#define Y second
#define pb push_back
//#define mp make_pair
#define ms(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f;
#define lson l,m,2*rt
#define rson m+1,r,2*rt+1
typedef long long ll;
#define N 100010

int a[106][105];
int dp[105][105];
int main(){
    int n;
    scanf("%d",&n);
    ms(a,0);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            scanf("%d",&a[i][j]);
        }
    }

    for(int i=2;i<=n;i++){
        for(int j=1;j<=i;j++){

            a[i][j]+=max(a[i-1][j],a[i-1][j-1]);
        }
    }
    int ans=-1;
    for(int i=1;i<=n;i++) ans=max(ans,a[n][i]);
    cout<<ans<<endl;
    return 0;
}

 

 
posted @ 2018-04-16 12:25  litos  阅读(114)  评论(0编辑  收藏  举报