数字金字塔 动态规划(优化版) 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; }