动态规划-数组中求最长等差数列的长度

题目:给定一个数组求出数组最长等差数列的长度。
举例: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));
    }
}

你可能感兴趣的:(dp,动态规划,diff)