PATtest1.3:最大子列和
阿新 • • 發佈:2018-11-05
題目源於: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 版權宣告:本文為博主原創文章,轉載請附上博文連結!