[LeetCode]413 Arithmetic Slices(dp)

题目链接: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 };

 

posted @ 2017-03-10 15:43  Kirai  阅读(180)  评论(0编辑  收藏  举报