题目链接:https://leetcode.com/problems/arithmetic-slices/?tab=Description
题意:给一堆数,求在原数列中{相邻}并且是等差数列的不小于3个数的子段。
挺坑的,因为没注意必须在原数列中相邻想了一阵子。一开始是分块然后容斥求组合搞的,比如1,2,3,4,5这样的,我认为1,3,5也符合条件,然而不是,所以错了。
读懂题后就更容易了,直接分段dp。假如前面有f(i-1)个组合方式,现在来了一个数,并且这个数和之前的2个组成等差数列,那么在原先的基础上就多了一个情况,所以就是f(i)=f(i-1)+1。最后把各段的结果加起来就行。
1 class Solution { 2 public: 3 int numberOfArithmeticSlices(vector<int>& A) { 4 int n = A.size(); 5 int f[n+10]; 6 memset(f, 0, sizeof(f)); 7 int ret = 0; 8 for(int i = 2; i < n; i++) { 9 if(A[i] - A[i-1] == A[i-1] - A[i-2]) f[i] += f[i-1] + 1; 10 } 11 for(int i = 1; i < n; i++) ret += f[i]; 12 return ret; 13 } 14 };