/*子串和
时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{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 提示 输入数据很多,推荐使用scanf进行输入 来源 经典问题 上传者 张云聪 */
#include<stdio.h>
int b[1000001]; int main(){ int N; scanf("%d",&N); while(N--){ int n,sum=0,i,max=-200,j; b[0]=-1; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&b[i]); if(max<b[i]) max=b[i];//找出最大的数,max } if(max>0)//max大于0的数时,再判断 for(j=0;j<n;j++){ sum+=b[j]; if(max<sum) max=sum; if(sum<0) sum=0;//很不错! } printf("%d\n",max);//max小于0时,直接输出 } return 0; } //另类做法!,绝#include<stdio.h>
int main() { int n,m,i,max,sum; scanf("%d",&n); while(n--) { max=0; scanf("%d",&m); scanf("%d",&sum); max=sum; while(--m) { scanf("%d",&i); if(sum<0) sum=i; else sum+=i; if(sum>max) max=sum; } printf("%d\n",max); } } 作者:chao1983210400 发表于2013-7-22 20:02:34
阅读:10 评论:0