動態規劃-陣列中求最長等差數列的長度
阿新 • • 發佈:2019-01-29
題目:給定一個數組求出陣列最長等差數列的長度。
舉例: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));
}
}