PATtest1.3:最大子列和

Posted captain-dl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PATtest1.3:最大子列和相关的知识,希望对你有一定的参考价值。

题目源于:https://pintia.cn/problem-sets/16/problems/663

题目要求:输入一个数列,求其最大子列和。

 

问题反馈:1.部分C++代码不是很熟练

                  2.没有仔细读清楚题目,原文已经说过小于零的情况,不用过多的思考

 

解决方法:1.打印课上的常见代码,记忆背诵并默写

                 2.写题之前,先读题。多读英文的题,习惯英文读题

 

自己写的代码:

 

#include<stdio.h>
//using namespace std
#define MAXN 100000

void maxsub(int b[], int m){
    int sumtem = 0, maxsum = -1;
    int c = 0, d = m-1,begin=0;
    int j=0;
    for ( j = 0; j<m; j++){
        sumtem += b[j]; 
        if (sumtem>maxsum){
            maxsum = sumtem;
            begin=c;
            d = j;
        }
        else if (sumtem<0)
        {   
            sumtem = 0;
            c = j+1;
            
        
        }
        
    }
    int k=0;
    for(j = 0; j<m; j++){
        if(b[j]<0) k++;
    }
    if(k==m){
        maxsum=b[0];
    for(j = 0; j<m; j++){
        if(b[j]>=maxsum) { 
        maxsum=b[j];
        begin=j;
        d=j;
}    }
    
    }
    
    
    printf(" sum:%d   first:%d   last: %d ", maxsum, b[begin], b[d]);
}




int main(void){
    int k;
    scanf("%d", &k);
    int a[MAXN] = { 0 };
    int i = 0;
        for (i = 0; i<k; i++){
            scanf("%d", &a[i]);
        }
    maxsub(a, k);
    return 0;
}

 

 

优秀的网页代码:

#include "stdafx.h"
#include<iostream>
#include <vector>
using namespace std;
 
int main()
{
    int N;                //输入数列长度
    cin >> N;
    int * array = new int[N];
    for (int i = 0; i < N; i++) {
        cin >> array[i];
    }
    //sum为子列和,MAX为最大子列和,first记录子列和的第一项,src为最大子列和的第一项,end为最大子列和的最后一项
    int sum=0,first=0,src=N-1,end=N-1,max=-1;
    //动态规划
    for (int i = 0; i < N; i++) {
        sum += array[i];
        //当前子列和>最大子列和时修改MAX,即SUM>MAX时,将max = sum.
        if (sum > max) {
            max = sum;
            src = first;
            end = i;
        }
        //sum<0时重置sum,first
        if (sum <0) {
            first = i + 1;
            sum = 0;
        }
    }
    if (max<0) cout << 0 <<   << array[0] <<   << array[N - 1];
    else cout << max <<   << array[src] <<   << array[end];
    delete[] array;
    return 0; 
}

--------------------- 
作者:yzh1994414 
来源:CSDN 
原文:https://blog.csdn.net/yzh1994414/article/details/78070888 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

以上是关于PATtest1.3:最大子列和的主要内容,如果未能解决你的问题,请参考以下文章

从最大子列和问题看几种不同的算法思想

7-1 最大子列和问题

7-1 最大子列和问题 (20分)

最大子列和问题

最大子列和问题

复杂度_最大子列和问题