PAT資料結構_01-複雜度1 最大子列和問題
題目:https://pta.patest.cn/pta/test/15/exam/4/question/709
#include <iostream> using namespace std; int MaxSubseqSum2(int A[], int N); int MaxSubseqSum3(int A[], int left, int right); //(陣列名,元素左起0,元素終點n-1) int MaxSubseqSum4(int A[], int N); //(陣列名, 元素個數) int main() { int n; cin >> n; // int numSeq[n]; //C++是不支援用變數初始化陣列的 int numSeq[100000]; for(int i=0; i<n; i++){ cin >> numSeq[i]; } // int maxSum = MaxSubseqSum4(numSeq, n); int maxSum = MaxSubseqSum3(numSeq, 0, n-1); if(maxSum< 0) { maxSum = 0; } cout<<maxSum<<endl; return 0; } // 演算法2 窮舉法 int MaxSubseqSum2(int A[], int N){ int ThisSum, MaxSum = 0; int i, j, k; for(i=0; i<N; i++){ //i是子列左端位置 ThisSum = 0; //ThisSum是從A[i]到A[j]的子列和 for(j=i; j<N; j++){ //j是子列右端位置 ThisSum += A[j]; //對於相同的i,不同的j,只要在j-1次迴圈的基礎上累加1項即可 if(ThisSum > MaxSum) //如果剛得到的這個子列和更大 MaxSum = ThisSum; //則更新結果 } //j迴圈結束 } //i迴圈結束 return MaxSum; } int compareThreeNums(int a, int b, int c){ return a>b ? (a>c?a:c) : (b>c?b:c) ; //if a>b: then if a>c, else if b>c } // 演算法3 分而治之 int MaxSubseqSum3(int A[], int left, int right){ int leftMax, rightMax; //如果list中只剩一個元素了,則left==right if(left == right){ return A[left]; } //list不只一個元素,二分+治之 遞迴,獲得左右最大 int middle = (left + right) / 2; leftMax = MaxSubseqSum3(A, left, middle); rightMax = MaxSubseqSum3(A, middle+1, right); //尋找跨越邊界的最大 // int tempLeftMax, leftBorderMax = 0; //未顯式賦值,造成錯誤假內容 // int tempRightMax, rightBorderMax = 0; int tempLeftMax = 0, leftBorderMax = 0; for (int i = middle; i >= left; i--){ tempLeftMax += A[i]; if(tempLeftMax > leftBorderMax){ leftBorderMax = tempLeftMax; } } int tempRightMax = 0, rightBorderMax = 0; for (int i = middle+1; i <= right; i++){ tempRightMax += A[i]; if(tempRightMax > rightBorderMax){ rightBorderMax = tempRightMax; } } int middleMax = rightBorderMax + leftBorderMax; int maxSum = compareThreeNums(middleMax, leftMax, rightMax); return maxSum; } // 演算法4 線上方法/動態規劃 int MaxSubseqSum4(int A[], int N){ int maxSum, thisSum = 0; int i = 0; for(i = 0; i<N; i++){ thisSum += A[i]; /* 向右累加 */ if(thisSum > maxSum){ maxSum = thisSum; /* 發現更大和則更新當前結果 */ } else if (thisSum < 0){ /* 如果當前子列和為負 */ thisSum = 0; /* 則不可能使後面的部分和增大,拋棄之 */ } } //此題裡,不需要記錄最大和的具體項,發現新最大立刻更新,當前和已經小於0時,則加後面的大項必然可以大過加已有的負數 return maxSum; }
相關推薦
PAT資料結構_01-複雜度1 最大子列和問題
題目:https://pta.patest.cn/pta/test/15/exam/4/question/709 #include <iostream> using namespace std; int MaxSubseqSum2(int A[], in
PAT 資料結構 01-複雜度1. 最大子列和問題(20)
給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和
中國大學MOOC-陳越、何欽銘-資料結構-2018秋 01-複雜度1 最大子列和問題 (20 分)
01-複雜度1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和
PAT:01-複雜度1. 最大子列和問題
問題描述: 給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -
PAT 01-複雜度2. Maximum Subsequence Sum (25)&&PAT 01-複雜度1. 最大子列和問題(20)
/* 01-複雜度2. Maximum Subsequence Sum (25) 時間限制 400 ms 記憶體限制 65536 kB 程式碼長度限制 8000 B 判題程式 Standard 作者 CHEN, Yue Given a sequence of K integ
01-複雜度1 最大子列和問題(20 分)
題目描述: 給定K個整陣列成的序列{ N 1 , N 2 , …, N K },“連續子列”被定義為{ N i , N i+1 , …, N j },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續
01-複雜度1. 最大子列和問題
給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11, -4
01-複雜度1 最大子列和問題 (20分)分治
#include<bits/stdc++.h> using namespace std; int n,a[100000+5]; int maxsum(int x,int y) {
複雜度1 最大子列和問題 --C語言學習種種
01-複雜度1 最大子列和問題 (20分) 給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續
01-複雜度1 最大子列和問題 (20分)
根據求最大子列和的線上處理演算法即可。 #include<stdio.h> int main() { int n; int array[100005]; in
01-複雜度1. 最大子列和問題(20)
給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11, -4, 13, -5, -2 },
01-複雜度1 最大子列和問題 (20分)
01-複雜度1 最大子列和問題 (20分) 給定KK個整陣列成的序列{ N1N 1 , N2N 2 , ..., NKN K },“連續子列”被定義為{ NiN i , Ni1N i+1 , ..., NjN j },
MOOC資料結構課程 題集01 最大子列和問題
01-複雜度1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列
PTA資料結構與演算法題目集(中文)5-1 最大子列和問題 (20分)
給定KK個整陣列成的序列{ N_1N1, N_2N2, ..., N_KNK },“連續子列”被定義為{ N_iNi, N_{i+1}Ni+1, ..., N_jNj },其中 1 \le i \le j \le K1≤i≤j≤
7-1 最大子列和問題 (20 分)
給定K個整陣列成的序列{ N1, N2, …, NK },“連續子列”被定義為{ Ni, Ni+1, …, Nj },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11,
7-1 最大子列和問題(C語言版)
7-1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N1, N2, …, NK },“連續子列”被定義為{ Ni, Ni+1, …, Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最
演算法筆記-1-最大子列和-Maximum Subsequence Sum
題目內容: Given a sequence of KK integers {N1,N2,...,NK}. A continuous subsequence is defined to be {Ni,Ni+1,...,Nj} where 1≤i≤j≤K1
01-1. 最大子列和問題(20)
給定K個整陣列成的序列{ N1, N2, ..., NK },“連續子列”被定義為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11,
嚴蔚敏-資料結構-時間複雜度
T(n)=O(f(n))表示隨著問題規模n增大,演算法的增長率和f(n)的增長率一樣大。反應是是一種增長趨勢。 這裡的big o是cs中的一種表示方法,和高數裡的上界下界函式不是一個東西 需要記住的是: 增長率是分正負的 對數函式<冪函式<指數函式<n
[資料結構]01-複雜度2 Maximum Subsequence Sum
#include<stdio.h> #include <string.h> #define size 100050 int begin = 0, end = 0; int b = 0, e = 0; //定義成全域性變數方便修改 int FindMax(int