動態規劃——最大連續子序列和
阿新 • • 發佈:2020-12-20
動態規劃——最大子序和
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]結尾,那麼有兩種情況:
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)執行結果