1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
dp[i]表示:以i位置为结尾的所有子数组中有多少个等差数列
2.状态转移方程
dp[i] 等于什么
以i位置为结尾的等差数列,也就是说i位置必须和i-1,i-2位置构成等差数列,否则前面的数再多也没有意义
也就是分为两种情况:
1. c-b==b-a(和前两个位置构成等差) 2. c-b != b-a(和前两个位置不构成等差)
dp[i] = c-b == b-a ? dp[i-1] +1 : 0
3.初始化
保证填表的时候不越界
因为状态转移方程要用到前两个位置的值
所以初始化dp表里前连个位置
dp[0] = 0;dp[1] = 0;
4.填表顺序
为了填写当前状态的时候,所需要的状态已经计算过了
从左往右
5.返回值
题目要求+状态表示
dp表内所有元素的和
6.代码
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n = nums.size();
//1.创建dp表
vector<int> dp(n);
//2.初始化
//3.填表
for(int i = 2; i < n;i++)
{
dp[i] = nums[i] -nums[i-1] ==nums[i-1] -nums[i-2] ? dp[i-1]+ 1: 0;
}
//4.返回值
int sum = 0;
for(int i = 0;i < n;i++)
{
sum += dp[i];
}
return sum;
}
};