时间限制: 1 Sec 内存限制: 128 MB
题目描述
给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
1
5
1 2 -1 3 -2
样例输出
5
来源
#include <iostream> #include <stdio.h> #include <algorithm> #include <cmath> #include <math.h> #include <cstring> #include <string> #include <queue> #include <deque> #include <stack> #include <stdlib.h> #include <list> #include <map> #include <utility> #include <set> #include <bitset> #include <vector> #define pi acos(-1.0) #define inf 0x3f3f3f3f #define linf 0x3f3f3f3f3f3f3f3fLL #define ms(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; int gcd(int x, int y) { if(y==0)return x; return gcd(y, x%y); } int t; ll n; ll a[1000005]; ll dp[1000005]; int main() { scanf("%d",&t); while(t--) { ms(dp,0); scanf("%lld",&n); for(int i=1; i<=n; i++) scanf("%lld",&a[i]); ll ans=0; ll maxn=0; for(int i=1; i<=n; i++) { dp[i]=max(dp[i-1]+a[i],a[i]); } for(int i=0;i<n;i++) maxn=max(maxn,dp[i]); printf("%lld\n",maxn); } return 0; }
直接法
#include <iostream> #include <stdio.h> #include <algorithm> #include <cmath> #include <math.h> #include <cstring> #include <string> #include <queue> #include <deque> #include <stack> #include <stdlib.h> #include <list> #include <map> #include <utility> #include <set> #include <bitset> #include <vector> #define pi acos(-1.0) #define inf 0x3f3f3f3f #define linf 0x3f3f3f3f3f3f3f3fLL #define ms(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; int gcd(int x, int y) { if(y==0)return x; return gcd(y, x%y); } int t; ll n; ll a[1000005]; int main() { scanf("%d",&t); while(t--) { scanf("%lld",&n); for(int i=0; i<n; i++) scanf("%lld",&a[i]); ll ans=0; ll maxn=0; for(int i=0; i<n; i++) { if(ans>0) { ans+=a[i]; } else { ans=a[i]; } maxn=max(maxn,ans); } printf("%lld\n",maxn); } return 0; }