leetcode 413.等差数列划分 动态规划详解

由于之前每日一题疯狂动态规划,所以看到题目的第一眼想的就是动态规划。而动态规划有四个标准的步骤:

1.定义状态;

2.转移方程;

3.初始状态;

4.返回值。

1.定义状态:     

        首先我们需要建立一个动态规划数组dp,长度为nums.size()+1或者nums.size()(这个因个人习惯而已),dp[i]表示遍历到nums的第i个数字时nums中所有为等差数组的子数组个数。

2.转移方程:

        转移方程的建立是动态规划中非常关键的一个步骤,对于算法的成功与否有着决定性的作用。一般来说转移方程是存在两个不同的情况,针对于算法中两种不同的情形。

if(相邻两个插值相等)//即nums[i]-nums[i-1]=nums[i+1]-nums[i]
dp[i]=dp[i-1]+1+length-3;

当新遍历的数与之前已遍历数列构成一个等差数列时,可以直接将nums[i]加入之前的等差子数列中,此时使用length来记录等差子数列的长度,等差子数列新加入一个数,构成的等差数列会整体构成新的(+1由来),以新加入的数往前的第三个数为起始点,包含新加入数的数列为length-3。

if(相邻两个插值不相等)//即nums[i]-nums[i-1]!=nums[i+1]-nums[i]
    dp[i]=dp[i-1];
    length=2;

不相等时,等差子数列中的等差数列数目不会变化。

3.初始状态:

dp[0]=0;dp[1]=0;

4.返回值:

dp[nums.size()-1]或者dp[nums.size()],依据自己定义的dp数据长度而言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值