1. 程式人生 > >PAT資料結構_01-複雜度1 最大子列和問題

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個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 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個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 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個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列

PTA資料結構與演算法題目集(中文)5-1 大子問題 (20分)

給定KK個整陣列成的序列{ N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ },“連續子列”被定義為{ N_iN​i​​, N_{i+1}N​i+1​​, ..., N_jN​j​​ },其中 1 \le i \le j \le K1≤i≤j≤

7-1 大子問題 (20 分)

給定K個整陣列成的序列{ N​1​​, N​2​​, …, N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, …, N​j​​ },其中 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