求一个数组中等差递减区间个数,等差数列必须是连续的。
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.
分析:用动态规划解决问题的关键是找到每个问题的核心公式,并且知道如何存表。例如本题,我们需要一个存储总数的变量,和一个存储差量的变量。
什么是等差数列? A[i]-A[i-1]=A[i-1]-A[i-2]
#include<iostream>
//数组长大于3
//dp[i] 表示到i位置时,子数组的个数
//数组中等差递增区间个数 ,等差数列要是连续的
class Solution {
public:
int numberOfArithmeticSlices(int a[]) {
int res = 0, n = 5;
int dp[10] = {0};
for(int i = 2; i < n; i++){
if(a[i] - a[i-1] == a[i-1] - a[i-2])
dp[i] = dp[i - 1] + 1;
std::cout << res << "," << dp[i] << std::endl;
res += dp[i];
}
return res;
}
};
int main(){
int a[] = {1, 2, 3, 4, 5};
Solution s;
int n = s.numberOfArithmeticSlices(a);
std::cout<< "n=" << n << std::endl;
}
打印:
0,1
1,2
3,3
n=6
// dpi res
// i = 2 123 1 1
// i = 3 123 234 1234 2 3
// i = 4 123 234 345 1234 2345 12345 3 6
// i = 5 123 234 345 456 1234 2345 3456 12345 23456 123456 4 10
其实仔细观察这就是一个斐波拉切数列,0,1....n-2数的求和,动态规划找到方程了就发现非常简单了,这就是规律,但需要自己 去发现这个规律,有些题目咋看一脸懵逼,仔细看就会发现其中的规律。