算术切片

题目:给一个数组,求可以切多少片,切的片要求至少有三个数,并且成等差数列,比如【1,2,3,4】可以切成【1,2,3】,【2,3,4】和【1,2,3,4】三种

思路:自己举几个例子找下规律,用动态规划的话,当前值依赖之前一个值和一个参数,这个参数从1开始每次增加1,比如[1,2,3,4,5] dp[0]=0;dp[1]=0;dp[2]=dp[1]+x=0+1=1; dp[3]=dp[2]+x=1+2=3(x每次会加1,至于为什么,模拟一下就出来了),但是如果中间出现断裂,比如【1,2,3,6,7,8】到了dp[3]的时候,那么x就要重新被初始化

public int numberOfArithmeticSlices(int[] A) {
        int n=A.length;
        if(n<2) return 0;
        if(n==2) return 0;
        int[] dp = new int[n];
        dp[0]=0;
        dp[1]=0;
        int sum=0;
        for(int i=2;i<n;i++){
            if(A[i]-A[i-1]==A[i-1]-A[i-2]){
                 sum++;
            }else{
                  sum=0;
            } 
            dp[i]=sum+dp[i-1];
        }
        return dp[n-1];
    }

 

posted @ 2017-04-23 01:08  雪浪snowWave  阅读(126)  评论(0编辑  收藏  举报