Grace25 @ 2021-08-23 16:44:08
我在AcWing上提交了这道题,但WA了
可是我在洛谷上是AC的
我也挑不出啥错来
拿了题解对拍,一个输出25,一个输出33
这把我整蒙了
求人对拍QAQ
附上代码:
#include<iostream>
using namespace std;
long long r,a[501],f[501]={0};
int main(){
long long ans=-0x3f;
cin >> r;
for(int i=1;i<=r;i++){
f[0]=0;
for(int j=1;j<=i;j++)
cin >> a[j];
for(int j=i;j>=1;j--){
f[j]=max(f[j-1],f[j])+a[j];
ans=max(ans,f[j]);
}
}
cout << ans;
return 0;
}
涉事数据:
10
-6
-4 -5
-3 7 5
3 7 -2 1
10 2 -6 2 -6
-8 3 8 6 7 9
-4 -10 0 -3 4 9 2
0 5 5 5 10 -6 -5 -4
-9 7 4 9 8 -5 -2 3 2
-7 -4 0 -10 -8 -4 3 -5 8 9
正确输出
25
by __ZXYAKIOI__ @ 2021-08-23 16:58:42
@202112xyk 对的qwq
by 19ty53 @ 2021-08-23 16:59:06
by 老子是北瓜 @ 2021-08-23 16:59:15
@Grace25 眼瞎了(
by xieyikai2333 @ 2021-08-23 16:59:23
@Grace25 把f数组初始化为负无穷试试?
by Grace25 @ 2021-08-23 17:00:50
@202112xyk 好的,试试
by xieyikai2333 @ 2021-08-23 17:00:56
by 老子是北瓜 @ 2021-08-23 17:03:49
@Grace25 c,acwing上的数据三角形中的数可以为负数
by Grace25 @ 2021-08-23 17:08:21
@202112xyk 好像不太行
#include<iostream>
#include<cstring>
using namespace std;
long long r,a[501],f[501];
int main(){
long long ans=-0x3f;
memset(f,-0x3f,sizeof(f));
cin >> r;
for(int i=1;i<=r;i++){
for(int j=1;j<=i;j++)
cin >> a[j];
for(int j=i;j>=1;j--){
f[j]=max(f[j-1],f[j])+a[j];
ans=max(ans,f[j]);
}
}
cout << ans;
return 0;
}
输出:-63
by xieyikai2333 @ 2021-08-23 17:13:27
@Grace25 emmm。。。
by xieyikai2333 @ 2021-08-23 17:51:38
@Grace25
这样:
#include<iostream>
using namespace std;
long long r,a[501],f[501];
int main(){
long long ans=-0x3f3f3f3f;//改动1:0x3f可能不够吧
f[0]=-0x3f3f3f3f;//改动2: f[0]在开始的时候初始化一下就可以了
cin >> r;
cin>>f[1];//改动3:第一个数直接就是f[1]的值
for(int i=2;/*改动4:第一行预处理过了,直接第二行开始*/i<=r;i++){
f[i]=-0x3f3f3f3f;//改动5:金字塔每一行多一个数,f[i]是新增的,也初始化为负无穷
for(int j=1;j<=i;j++)
cin >> a[j];
for(int j=i;j>=1;j--){
f[j]=max(f[j-1],f[j])+a[j];
// ans=max(ans,f[j]);
}
}
for(int i=1;i<=r;i++)ans=max(ans,f[i]);//改动6:因为有负数,ans可能会变小,所以最后再结算
cout << ans;
return 0;
}