程式設計練習題 求解全排列求最大子陣列之和(Java)

2021-08-20 14:12:17 字數 2291 閱讀 2254

給定乙個整數陣列,找到乙個具有最大和的子陣列,返回其最大和。

樣例給出陣列[−2,2,−3,4,−1,2,1,−5,3],符合要求的子陣列為[4,−1,2,1],其最大和為6

1、找出子陣列的最左端點 for i<-1 to n

2、找出子陣列的最右端點 for j<-i to n

3、求和,找出最大值 sum = a[i] +……+a[j]; ans = max(ans, sum)

class solution 

if(sum > ans)}}

return ans;

}};

重複利用已計算的子陣列和,

左端點相同的子陣列,隨著長度的增加,排在前面的元素被不斷重複相加。如果我們記錄下之前的求和結果,

就不需要對前面的元素再進行計算,比方法一少了一重迴圈。

class solution }}

return ans;

}};

首先來說下動態規劃法的概念。

動態規劃求解的基本步驟:

能採用動態規劃求解的問題一般要具有3個性質:

(1)最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。

(2)無後效性:即某階段的狀態一定確立,就不受這個狀態以後決策的影響,也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

動態規劃演算法有一定自己的模式,一般要經歷如下幾個步驟:

(1)劃分階段:按照問題的時間或空間特徵,把問題分為若干個階段,在劃分階段注重劃分後的階段一定要是有序或者是可排序的,否則問題就無法求解。

(2)確定狀態和狀態變數:將問題發展到各個階段時所處於的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無後效性。

但事實上常常是反過來做,根據相鄰的兩個階段的狀態之間的關係來確定決策方法和轉移方程。

(4)尋找邊界條件:給出的狀態轉移方程是乙個遞推式,需要乙個遞推的終止條件或者邊界條件。

動態規劃法的基本思想:

將待求解的基本問題分為若干個子問題,按照順序求解子階段,前乙個問題的解,為後一子問題的求解提供有用的資訊。在求解任何問題時,列出各種可能的區域性解,通過決策保留那些可能達到最優的區域性解,丟棄其他區域性解。依次解決各個子問題,最後乙個子問題就是初始化的解。

動態規劃採用的基本辦法:

為了節約重複求相同子問題的時間,引入乙個陣列或者一組變數,不管它們是否對最終解有用,把所有子問題的解存於該陣列或者這組變數中。

/*如果用函式f(i)表示以第i個數字結尾的子陣列的最大和,那麼我們需要求出max(f[0...n])。 

我們可以給出如下遞迴公式求f(i)

|-- array[i] 如果i==0或者f(i-1)<0

f(i)=|

|-- f(i-1) + array[i] 如果f(i-1)>0

這個公式的意義:

當以第(i-1)個數字為結尾的子陣列中所有數字的和f(i-1)小於0時,如果把這個負數和第i個數相加,得到的結果反而不第i個數本身還要小,所以這種情況下最大子陣列和是第i個數本身。

如果以第(i-1)個數字為結尾的子陣列中所有數字的和f(i-1)大於0,與第i個數累加就得到了以第i個數結尾的子陣列中所有數字的和。

*/public

class array ;

int len=array.length;

int c=new

int[len];//引入乙個陣列

int max = -1000;//用來記錄陣列c中的最大值

int start = 0;//記錄陣列中子陣列的最大和的開始位置

int end = 0;//記錄陣列中子陣列的最大和的結束位置

int tmp = 0;//中間變數

c[0] = array[0];

for (int i = 1; i < len; ++i)

else

if (c[i] > max)

}system.out.println(start+"~"+end+"max is:"+max);

}}

2.針對這個問題,遞推公式是dp[i] = max;既然轉移方程出來了,意味著寫一層迴圈就可以解決這個問題。

如果子串a的和是負數,而子串b包含子串a,那b則不需要進行計算。這樣就省去了一些計算步驟。

將子串和為負數的子串丟掉,只留和為正的子串。

class solution 

if(sum < 0)

}return ans;

}};

程式設計開發練習題 最大子段和

問題描述 程式設計開發練習題 最大子段和。給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0,依此定義,所求的最優值為 max,1 i j n。自上而下的分治演算法 將序列a 1 n 分解為長...

練習題 連續最大子陣列問題(最簡單的解釋)

問題描述 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 例 輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。int main 主...

資料結構課後練習題(練習一)7 1 最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下 輸入第1行給出正整數k 第2行給...