最大子段和動態規劃「最大子段和問題什麼意思」

從今天開始呢,我們就正式開始數據結構的學習了,可以說,這是計算機專業中最為核心的一門課程,也是最為重要的一塊內容。

這一部分,是企業招聘時最為看重的一部分,也是大家解決演算法實現邏輯最為重要的一部分,更是幫助大家找到一份好工作的重要籌碼。

我們今天的這道題呢,就是解決「最大子列和問題」。

給定K個整數組成的序列{N1,N2,…,NK},「連續子列」被定義為{Ni,Ni+1,…,Nj},其中1<=i<j<K,而「最大子列和」則是找到一個所有連續子列元素的和中的最大值。

比方說給定一組序列為{-2,11,-4,13,-5,-2},其中連續子序列{11,-4,13}則是最大值為20。

那麼最終列印輸出的結果則為20。

C語言解決「最大子列和問題」,數據結構由此開始(第一節)

梳理邏輯

對於函數題,特別是解決數據結構與演算法題的時候,一定要靜下心來,然後梳理清楚題目的邏輯,當然了,現在不太會也很正常,完全可以慢慢來,但是如果要找工作的話,那可得加把勁了。

1、輸入第一行給出正整數K(<=100000),用到一個scanf函數來輸入。

2、第二行給出K個整數,因為我們是一個序列,所以用到的是數組。

3、最麻煩的則是找出最大和的子序列,我們可以這樣來理解:

先從數組中的第一個元素開始加起,找到包含第一個元素的所有子序列的和,並比較大小。

然後找出最大值的和,記錄下來。

與此同時,下一次循環遍歷的時候就把這個和清零,但是最大值不變。

依次繼續求和,並與最大值比較大小,記錄下相對較大的那個值。

在所有循環都結束後,最終的那個最大值則是我們要求的最大值。

C語言解決「最大子列和問題」,數據結構由此開始(第一節)

代碼實現

//最大子列和問題
#include<stdio.h>
int main(){
	int K;//給出正整數K
	int M[100000];//給出K個整數
	int count;//計數法
	int SUM = 0;//遍歷求和
	int MAX = 0;//初始的最大值為0
	scanf("%d", &K);
	for(int i=0;i<K;i++){
		scanf("%d",&M[i]);
		if(M[i]<0){
			count++;
		}
	}
	if(count==K){//所有的數都是0的情況下
		printf("0");
	}
	for(int i = 0; i < K; i++){
		//從元素1開始
		SUM = 0;//每次循環求和的時候,求和都要變為0才行
		for(int j = i; j < K; j++){
			SUM = SUM + M[j];
			if(SUM > MAX){
				MAX = SUM;
			}
		}
	}
	printf("%d",MAX);

}

結果測試

C語言解決「最大子列和問題」,數據結構由此開始(第一節)
C語言解決「最大子列和問題」,數據結構由此開始(第一節)

總結

這道數據結構題,可以說是數據結構章節中最為簡單的一道題目了,有難度的還在後面呢,我研究生快畢業了,也知道自己得快速提升實力了,秋招末班車以及春招開啟,一定要趕上,沖!!!

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/203851.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-07 12:12
下一篇 2024-12-07 12:12

相關推薦

發表回復

登錄後才能評論