1007. Maximum Subsequence Sum (25)
2017-10-27 09:16
405 查看
1. 原题链接
1007. Maximum Subsequence Sum (25)2. 理解题目
给一个K个数字的数列,输出最大连续子序列和,首元素和尾元素;如果该数列都是负数,输出0以及整个数列的首、尾元素;3. 解题思路
作为算法入门的例题,我们知道求最大连续子序列和的方法有4种(可以参见刘汝佳紫书–P220-224),本题经测试在O(N2)复杂度下仍可以通过;下面就采用O(N2)和O(N)的复杂度进行展示;
具体原理参见刘汝佳紫书——P220-224
4. AC代码
//[解法 1] //O(n)复杂度算法:从头开始加,当和小于0就置为0,重新继续求和;否则选择到目前更大的和; //为了求出对应序列的首、尾元素,在和小于0时,暂时记住下一个元素(就是接下来的序列的首元素), //当发现新的和更大时,就把刚才暂存的首元素变为最终所求的首元素; #include<cstdio> const int maxn=10010; int n,a[maxn]; int max_sum,st,ed;//结果 int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); max_sum=a[0];st=a[0];ed=a[0];//初始化 int tmp_sum=0;int tmp_start=a[0]; //暂时的和结果,暂存的首元素 for(int i=0;i<n;i++){ tmp_sum+=a[i]; if(tmp_sum>max_sum){ max_sum=tmp_sum; ed=a[i]; st=tmp_start; } if(tmp_sum<0) {tmp_sum=0;tmp_start=a[i+1];} } if(sum<0) printf("%d %d %d\n",0,a[0],a[n-1]); else printf("%d %d %d\n",max_sum,st,ed); } //[解法 2] #include<cstdio> const int maxn=10010; int n,a[maxn]; int max_sum,st,ed; int sum[maxn]; int main(){ scanf("%d",&n); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; //保存从首元素求和的结果 } max_sum=sum[1];st=a[1];ed=a[1]; for(int i=0;i<n;i++){ //累加起始下标i+1 for(int j=i+1;j<=n;j++){ //累加到下标为j if(sum[j]-sum[i]>max_sum){ //如果不保存求和结果sum[],则此处重新求和,复杂度变成O($N^3$) st=a[i+1];ed=a[j]; max_sum=sum[j]-sum[i]; } } } if(max_sum<0) pr 4000 intf("%d %d %d\n",0,a[1],a ); else printf("%d %d %d\n",max_sum,st,ed); } //[解法 2]的错误做法 #include<cstdio> const int maxn=10010; int n,a[maxn]; int max_sum,st,ed; int sum[maxn]; int main(){ scanf("%d",&n); scanf("%d",&a[0]);sum[0]=a[0]; for(int i=1;i<n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } max_sum=sum[0]; //以下做法错误的原因在于,无法计算 a[0]+a[1],所以需要设置前置的sum[0]=0,数据从下标1开始存放 for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(sum[j]-sum[i]>max_sum){ st=a[i+1];ed=a[j]; max_sum=sum[j]-sum[i]; } } } if(max_sum<0) printf("%d %d %d\n",0,a[0],a[n-1]); else printf("%d %d %d\n",max_sum,st,ed); }
相关文章推荐
- 【PAT】1007. Maximum Subsequence Sum (25)
- PAT-1007. Maximum Subsequence Sum (25)
- 【PAT】【Advanced Level】1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- PAT - 甲级 - 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- PAT 1007. Maximum Subsequence Sum (25)(dp动态规划)
- 1007. Maximum Subsequence Sum (25)
- 【PAT甲级】1007. Maximum Subsequence Sum (25)
- PAT(甲级) 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- PAT练习(4)-1007. Maximum Subsequence Sum (25)
- PAT甲题题解-1007. Maximum Subsequence Sum (25)-求最大子区间和
- PAT甲级 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)
- PAT 1007. Maximum Subsequence Sum (25)
- 1007. Maximum Subsequence Sum (25)