动态规划dp —— 23.等差数列划分

动态规划dp —— 23.等差数列划分_第1张图片

 1.状态表示

是什么?dp表中里的值所表示的含义就是状态表示

dp[i]表示:以i位置为结尾的所有子数组中有多少个等差数列

2.状态转移方程

dp[i] 等于什么

以i位置为结尾的等差数列,也就是说i位置必须和i-1,i-2位置构成等差数列,否则前面的数再多也没有意义动态规划dp —— 23.等差数列划分_第2张图片

也就是分为两种情况:

1.  c-b==b-a(和前两个位置构成等差)  2. c-b != b-a(和前两个位置不构成等差)

动态规划dp —— 23.等差数列划分_第3张图片

 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& nums) {
        int n = nums.size();
        //1.创建dp表
        vector 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;
    }
};

你可能感兴趣的:(动态规划,动态规划,算法)