1. 程式人生 > >PATtest1.3:最大子列和

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!