zoukankan      html  css  js  c++  java
  • 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;
    }
     
  • 相关阅读:
    Python学习日记(一)——初识Python
    读《乌合之众》
    用WPF做了几个小游戏
    《HeadFirst设计模式》读后感——对学习设计模式的一些想法
    设计模式C#实现(九)——工厂方法模式和简单工厂
    设计模式C#实现(八)——原型模式
    设计模式C#实现(七)——生成器模式
    设计模式C#实现(六)——单例模式
    《小强升职记》读后感和思维导图
    《魔鬼搭讪学》《魔鬼约会学》读后感
  • 原文地址:https://www.cnblogs.com/fht-litost/p/8855272.html
Copyright © 2011-2022 走看看