由于之前每日一题疯狂动态规划,所以看到题目的第一眼想的就是动态规划。而动态规划有四个标准的步骤:
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数据长度而言。