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;
    }
     
  • 相关阅读:
    Golang 数组
    Golang 定时任务库使用
    Golang 选项设计模式
    使用阿里云构建海外docker镜像
    大数相加算法实现
    递归思想和迭代思想
    阶乘函数(factorial)——结果在整型范围内的阶乘计算
    最大公约数和最小公倍数(Greatest Common Divisor and Least Common Multiple)
    日结(2018年12月23日)
    日结(2018年12月22日)
  • 原文地址:https://www.cnblogs.com/fht-litost/p/8855272.html
Copyright © 2011-2022 走看看