zoukankan      html  css  js  c++  java
  • 数字金字塔 动态规划(优化版) USACO 一维dp压缩版

    1016: 1.5.1 Number Triangles 数字金字塔

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 9  解决: 8
    [提交] [状态] [讨论版] [命题人:外部导入]

    题目描述



    1.5.1 Number Triangles (numtri)
    (numtri.pas/c/cpp)


    观察下面的数字金字塔。

    写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

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

    在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大的和,也就是答案啦!哈哈

    格式

    PROGRAM NAME: numtri

    INPUT FORMAT:

    (file numtri.in)

    第一个行包含 R(1<= R<=1000) ,表示行的数目。

    后面每行为这个数字金字塔特定行包含的整数。

    所有的被供应的整数是非负的且不大于100。

    OUTPUT FORMAT:

    (file numtri.out)

    单独的一行,包含那个可能得到的最大的和。

    SAMPLE INPUT

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

    SAMPLE OUTPUT

    30

    提示

    来源/分类

     
     
     
     
     
    唉这个题也不知道做了多少遍了
    不如尝试一个优化做法
    老师给了个提示 可以把空间复杂度优化为O(n)
     
    来来来
    #include<bits/stdc++.h>
    using namespace std;
    int arr[1005];
    int dp[1005];//压缩成一维   
    int main()
    {
        int n,ans=-1;
        int remembering1=0,re=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++)
                scanf("%d",&arr[j]);
            remembering1=0,re=0;
            for(int j=1;j<=i;j++){
                remembering1=dp[j];
                dp[j]=max(dp[j],re)+arr[j]; 
                re=remembering1;
                if(i==n) ans=max(ans,dp[j]);
            }
        }
        printf("%d",ans);
        
        
        
        return 0;
    }
  • 相关阅读:
    单独设置css的class属性
    理解闭包的使用方法
    npm常用命令和总结
    前端调试之服务器
    gulp 报错的处理——个人经验
    工作经验备忘
    c++:虚函数和纯虚函数(转载)
    snmp学习、配置
    sigar学习
    linux安装VSCode
  • 原文地址:https://www.cnblogs.com/Tidoblogs/p/11268242.html
Copyright © 2011-2022 走看看