1. 程式人生 > >動態規劃-陣列中求最長等差數列的長度

動態規劃-陣列中求最長等差數列的長度

題目:給定一個數組求出陣列最長等差數列的長度。
舉例:3,8,4,5,6,2
輸出:5。
思路:利用區間dp來做,dp[i][diff]的意思是 intAr[0]到intAr[i],等差為diff的等差長度。在求dp長度的時候利用一個ans變數儲存最大即可。
dp的求法:
有diff=intAr[i]-intAr[j](j<i)
dp[i][diff]=dp[j][diff]。
細節處理:
我們首先會對陣列排序,然後用最大減去最小,來建立我們陣列的長度範圍,如果最大和最小相等,我們就不需要建立dp陣列,直接返回我們整個陣列的長度。!!!!!!下面給出程式碼:

import java.util.Arrays;

/**
 * Created by lizhaoz on 2016/4/24.
 */
public class Findlength { public static int calApLength(int[] intAr){ if (intAr==null){ return 0;//返回空的情況 } Arrays.sort(intAr); int maxlen=intAr[intAr.length-1]-intAr[0]; int ans=1; if (maxlen==0){ return intAr.length; } //dp[i][diff]的意思是intAr[0]到intAr[i],等差為diff的等差長度
// 有diff=intAr[i]-intAr[j],j<i // dp[i][diff]=dp[j][diff]=1 int[][] dp=new int[intAr.length][maxlen+1]; for (int i = 0; i <dp.length ; i++) { for (int j = 0; j < maxlen+1; j++) { dp[i][j]=1; } } for (int i = 1
; i <intAr.length ; i++) { for (int j = i-1; j >=0; j--) { int diff=intAr[i]-intAr[j];//算出i和j之間的等差 dp[i][diff]=dp[j][diff]+1;//當前 ans=Math.max(ans,dp[i][diff]); } } return ans; } public static void main(String[] args) { int[] a=new int[]{3,8,4,5,6,2}; System.out.println(calApLength(a)); } }