题意:一段数字序列,如果存在一个不包括所有值的连续区间的和大于等于序列所有值的和,输出NO
, 否则输出 在YES
。
分析: 最大连续子区间解法:\(dp[i]=max(dp[i-1],0)+a[i]\) 。 如何不让包括所有值呢?只需要\([1,n-1]\) 和\([2,n]\) 求两次就可以把所有连续区间(除包括所有值的区间外)都考虑在内。最后简单比较以下就行。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MA=1e5+5;
ll val1[MA],val2[MA];//分别用于两次最大连续区间和
ll maxx,sum; //维护最值,所有值之和
int n,T;
ll a[MA];
void init()
{
memset(val1,0,sizeof(val1));
memset(val2,0,sizeof(val2));
maxx=0;
sum=0;
}
void solve()
{
for(int i=1;i<n;++i){
val1[i]=max(val1[i-1]+a[i],a[i]);
maxx=max(maxx,val1[i]);
}
for(int i=2;i<=n;++i){
val2[i]=max(val2[i-1]+a[i],a[i]);
maxx=max(maxx,val2[i]);
}
if(maxx<sum)printf("YES\n");
else printf("NO\n");
}
int main()
{
scanf("%d",&T);
while(T--){
init();
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
sum+=a[i];
}
solve();
}
return 0;
}
原文:https://www.cnblogs.com/A-sc/p/12179067.html