一. 题目

二. 思路

三. 代码

class Solution
{
    public int numberOfArithmeticSlices(int[] nums)
    {
        DP dp=new DP();
        return dp.work(nums);
    }
}

class DP
{
    static final int N=(int)1e3+10;
    int[][] f=new int[N][N];
    HashMap<Integer, ArrayList<Integer>> mp=new HashMap<>();//值对应的下标

    void init()
    {
        for(int i=0;i<N;i++)
            Arrays.fill(f[i],0);
        mp.clear();
    }

    int work(int[] a)
    {
        for(int i=0;i<a.length;++i)
            if(mp.containsKey(a[i])) mp.get(a[i]).add(i);
            else
            {
                ArrayList<Integer> list=new ArrayList<>();
                list.add(i);
                mp.put(a[i], list);
            }

        int ans=0;
        for(int i=0;i<a.length;++i)
            for(int j=0;j<i;++j)
            {
                long ak=2L*a[j]-a[i];
                if(ak<Integer.MIN_VALUE||ak>Integer.MAX_VALUE) continue;

                ArrayList<Integer> akl=mp.get((int)ak);//注意ak转成int
                if(akl==null) continue;
                for(int k:akl)
                {
                    if(k>=j) break;
                    f[j][i]+=f[k][j]+1;
                }
                ans+=f[j][i];
            }
        return ans;
    }
}