传送门
题意:给出n个数a1,a2,a3....an ,比较n个数之和
与子区间[l...r]([l..r]!=[1..n])和的大小;
线性dp可以维护每个区间的和。
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include<cstring>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5+5;
ll n,t,tmp;
ll a[maxn],dp[maxn],d[maxn];
int main()
{
cin>>t;
while (t--){
ll sum=0;
memset(dp,-INF,sizeof(dp));
memset(d,-INF,sizeof(d));
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),sum+=a[i];
dp[1]=a[1];
ll Max=-INF;
Max=max(Max,dp[1]);
for(int i=2;i<n;i++)
dp[i]=max(dp[i-1]+a[i],a[i]),Max=max(Max,dp[i]);
d[2]=a[2];
Max=max(Max,d[2]);
for(int i=3;i<=n;i++)
d[i]=max(d[i-1]+a[i],a[i]),Max=max(Max,d[i]);
if(sum>Max)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}