1. 程式人生 > 其它 >動態規劃——最大連續子序列和

動態規劃——最大連續子序列和

技術標籤:最大子序和java動態規劃演算法java

動態規劃——最大子序和

1.問題描述

給定一個整數陣列nums,找到一個具有最大連續子陣列(子陣列最少包含一個元素),返回其最大和。
示例
輸入:[-2,1,-3,4,-1,2,1,-5,4]
輸出:6
解釋:連續子陣列[4,-1,2,1]的和最大為6

2.要求

(1)寫出問題分析的過程
(2)寫出程式程式碼
(3)貼出程式結果

實驗過程

(1)分析過程
利用動態規劃來解決,即可以通過一次遍歷完成對最大子序列以及相應位置座標的求解。
步驟一:令狀態dp[i]表示A[i]作為連續序列的最大和(這裡所說A[i]必須作為連續序列的末尾)。
步驟二:作如下考慮:因為dp[i]要求必須以A[i]結尾,那麼有兩種情況:

1.這個最大序列連續序列只有一個元素,即A[i]
2.有多個元素時,即從前某處A[p]開始,一直到A[i]結尾
對於第一種情況,最大和就是A[i]本身、
對於第二種情況,最大和就是dp[i-1]+A[i]
於是就得到狀態方程:dp[i-1]=max{A[i],dp[i-1]+A[i]}
這個式子只和i與i之前的元素有關,且邊界為dp[0]=A[0],由此從小到大列舉i,既可以得到整個陣列。接著輸出陣列dp中最大的數值即最大連續子序列的和。
(2)程式程式碼

package ch01;

import java.util.Scanner;

public class zuidahelianxuxulie
{ static int maxn=10010; //求較大值 public static int max(int a,int b) { return a>b?a:b; } public static void main(String[] args) { Scanner scanner =new Scanner(System.in); System.out.println("請輸入陣列的個數:"); int n=scanner.nextInt(); int [] A =new int [maxn]; System.out.println
("請輸入陣列:"); for(int i=0;i<n;i++) { A[i]=scanner.nextInt(); } int [] dp = new int [n]; dp[0]=A[0]; for(int i=1;i<n;i++) { //狀態轉方程 dp[i]=max(A[i], dp[i-1]+A[i]); } //求最大連續子序列和 int k; k=dp[0]; for(int i=1;i<n;i++) { if(dp[i]>k) { k=dp[i]; } } System.out.println("最大和連續序列為:"+k); return; } }

(3)執行結果
在這裡插入圖片描述