数字金字塔 动态规划(优化版) 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;
}
原文地址:https://www.cnblogs.com/Tidoblogs/p/11268242.html