题目:
A sequence of number is called arithmetic if it consists of at least three elements and if the difference between any two consecutive elements is the same.
For example, these are arithmetic sequence:
1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9The following sequence is not arithmetic.
1, 1, 2, 5, 7
A zero-indexed array A consisting of N numbers is given. A slice of that array is any pair of integers (P, Q) such that 0 <= P < Q < N.
A slice (P, Q) of array A is called arithmetic if the sequence:
A[P], A[p + 1], ..., A[Q - 1], A[Q] is arithmetic. In particular, this means that P + 1 < Q.
The function should return the number of arithmetic slices in the array A.
Example:
A = [1, 2, 3, 4] return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself.
思路:
题目要求我们求出一个数列中有多少个元素个数大于等于3的等差数列,用动态规划算法来解决,用dp[0...m-1][0...n-1]来记录结果,要是dp[i][j] = ture则意味着序列从位置i 到 j 是一个等差数列,可以列出转移方程dp[i][j] = dp[i][j - 1]&&A[j] - A[j - 1] == A[j - 1] - A[j - 2]。
程序:
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& A) {
if(A.size() < 3)
return 0;
int count = 0;
vector<vector<bool> > dp(A.size(),vector<bool>(A.size(),false));
for(int i = 0;i <= A.size() - 2;i++)
dp[i][i + 1] = true;
for(int i = 2;i <= A.size() - 1;i++)
{
for(int j = 0;j <= A.size() - 1 - i;j++)
{
if(dp[j][j + i - 1]&&A[j + i] - A[j + i - 1] == A[j + i - 1] - A[j + i - 2])
{
dp[j][j + i] = true;
count++;
}
else
dp[j][j + i] = false;
}
}
return count;
}
};