为什么我的题目只有50分?(洛谷上没有此题)
题目:
1129. 【动态规划】数字三角形(2)游园礼物【加强】
(Input: num.in, Output: num.out)
时间限制: 1 s 空间限制: 256 MB 具体限制
题目描述
新年到了,学校里组织了有趣的游园活动!每个活动场地都被设计成一个三角形,在三角形的每个点位都设有一台机器人给同学们派发礼物。每个机器人派发的礼物数量是各不相同的,但同一个机器人每次派发礼物的数量是不变的。小王有其中一张活动场地地图,如图。活动要求小王从三角形顶部出发,向下行走获取礼物,但到一个点位后,只能选择向左走或向右走,一直走到最底层,并且有一个点位,是可以获得两次礼物的,如图,要获得最大礼物数,小王只能在(3,1)处拿两次礼物。小王该怎么走才能使自己获得的礼物数量最多呢?请你帮小王计算下,他最多能获得的礼物数是多少呢?
输入
从文件 num.in 中读入数据。
第1行只有一个整数n,表示n行;第2到n+1行,为每个点位机器人一次派发礼物的数量,数字之间有一个空格。
输出
输出到文件 num.out 中。
礼物数量总和的最大值。
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
38
数据范围限制
30%的数据,1<=n<=250;
100%数据,1<=n<=1000;
由于活动经费有限,单个机器人单次能够派发礼物的数量保证在10000以内。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[1005][1005],dp[1005][1005],prev[3][1005][1005];
int main()
{
freopen("num.in","r",stdin);
freopen("num.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);
dp[i][j]=a[i][j];
}
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(dp[i-1][j]>dp[i-1][j-1])
{
dp[i][j]+=dp[i-1][j];
prev[1][i][j]=i-1;
prev[2][i][j]=j;
}
else
{
dp[i][j]+=dp[i-1][j-1];
prev[1][i][j]=i-1;
prev[2][i][j]=j-1;
}
}
}
int ans=0,max1=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dp[n][i]);
}
for(int i=1;i<=n;i++)
{
if(ans==dp[n][i])
{
int p1=n,p2=i;
while(p1!=0&&p2!=0)
{
max1=max(max1,a[p1][p2]);
p1=prev[1][p1][p2];
p2=prev[2][p1][p2];
}
}
}
printf("%d\n",ans+max1);
return 0;
}