动态规划之等差递减区间个数

求一个数组中等差递减区间个数,等差数列必须是连续的。 
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数的求和,动态规划找到方程了就发现非常简单了,这就是规律,但需要自己 去发现这个规律,有些题目咋看一脸懵逼,仔细看就会发现其中的规律。

 

学习地址:http://www.mamicode.com/info-detail-2634216.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值