如果数字序列由至少三个元素组成并且任何两个连续元素之间的差异相同,则称为算术序列。

例如,这些是算术序列:

1,3,5,7,9 
7,7,7,7 
3,-1,-5,-9 
以下序列是不算术。

1, 1, 2, 5, 7

给出了由N个数组成的零索引数组A. 该阵列的子序列切片是任何整数序列(P0,P1,...,Pk),使得0≤P0<P1 <... <Pk <N。

如果序列A [P0],A [P1],...,A [Pk-1],A [Pk]是算术的,则阵列A的子序列片(P0,P1,...,Pk)被称为算术。特别是,这意味着k≥2。

该函数应返回数组A中的算术子序列片数。

输入包含N个整数。每个整数的范围为-231和231-1,0≤N≤1000。输出保证小于231-1。

例:

输入:[2,4,6,8,10]

输出:7

说明:
所有算术子序列切片为:
[2,4,6] 
[4,6,8] 
[6,8,10] 
[2,4,6,8] 
[4,6,8,10] 
[2,4,6,8,10] 
[2,6,10]

简单的子序列这种题,一般思路先想到的dp就是设置以第i个元素结尾的一种状态,然后能推到最后吧?

比如最长递增子序列这种的题。

那我们就试试:dp[i]代表以第i个元素结尾的等差数列的个数。

然后我们想一下状态转移方程是什么?

我们会发现,挺难推出来的。。因为对于本个元素,最容易想的思路就是把前面的结尾都遍历一遍,然后能组成等差数列的都加起来吧?

但是我们无法判断之前的结尾组成的等差数列中,加上第i个元素还能不能是等差数列。。。

比如第5个数是5,能和前面组成1,2,3,4,5和2,3,4,5和3,4,5和1,3,5这几个序列,那dp[4]应该是4咯,我们对于后面的结尾,比如数字7,算dp时,遍历到dp[4]了,我们无法判断dp[4]里这四个序列有几个公差为7-5=2(也就是能组成)。

我之前写过,动态规划就是空间优化时间的算法。

我们推不出来,因为信息不全。需要记录更多的信息。我们不止要知道dp[i]是多少,还要知道每个公差的序列有多少,才能推出来之后的dp序列。

我们可以二维dp[a][b]表示第a个元素结尾公差为b的序列个数,但是由于数据较为稀疏,浪费空间时间较大,我们可以map走一波。

比如上面那个例子,我们要记录:dp[4],公差为1的序列有仨,公差为2的有一个。

这样,我们之后遇到了6,那6-5=1,dp[4]里有三个序列公差为1,我们就能知道这三个序列加上6还是等差的。

遇到7,也能7-5=2,找dp[4]中公差为2的即可。

还有一个需要注意的点:题目说长度最小为3才算。

过程叙述:

计算两个数字之差diff,如果越界了不做处理

如果没越界,dp[i]中diff的映射增1,然后看dp[j]中是否有diff的映射

如果有的话,说明此时已经能构成等差数列了(三个数),将dp[j][d]加入结果res中,然后再更新dp[i][d]

这样等遍历完数组,res即为总数。

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <cmath>using namespace std;class Solution
{
public:int numberOfArithmeticSlices(vector<int>& A) {if (A.size() <= 2)return 0;int count = 0;vector<map<int, int>> dp(A.size());for (int i = 0; i < A.size(); i++){for (int j = 0; j < i; j++){if ((long)A[i] - (long)A[j] > INT_MAX || (long)A[i] - (long)A[j] < INT_MIN) continue;//节省时间int diff = A[i] - A[j];//公差dp[i][diff] += 1;if (dp[j].find(diff) != dp[j].end()) //能构成至少三个数等差{dp[i][diff] += dp[j][diff];count += dp[j][diff];}}}return count;}
};

map+DP leetcode446相关推荐

  1. [C++ map dp]codeforces 960F. Pathwalks

    题目传送门:960F 思路: 题目给人的感觉很像最长上升子序列,自然而然想到用dp的思路去处理 题目中给的限制条件是,要接上前面的边,前面的边权一定要小于当前的边权(题目按照输入的顺序,因此只找前面的 ...

  2. 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet

    文章目录 1.堆栈/队列/数组/链表:数据结构即计算机组织管理数据的方式,堆栈指的是内存图中的栈,不是堆 2.红黑树:二查,二查平,二查平1倍 3.List子接口:集合,IndexOutOfBound ...

  3. java编程贴纸问题_Java实现 LeetCode 691 贴纸拼词(DFS+map记录)

    691. 贴纸拼词 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话 ...

  4. codeforces的dp专题

    1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...

  5. LeetCode 740. 删除与获得点数(排序+动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 nums ,你可以对它进行一些操作. 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数.之后,你必须删除 ...

  6. 第四届“图灵杯”NEUQ-ACM程序设计人赛真题重现

    文章目录 前言 系列文章目录 一.蔡老板的会议 题目描述 分析 AC代码如下: 二.拿糖果 题目描述 分析 AC代码如下: 三.粉丝与分割平面 题目描述 分析 AC代码如下: 四.粉丝与汉诺塔 题目描 ...

  7. 数组arr中的字符串是贴纸,每种贴纸任选无数张,想要将target串拼出来,至少需要多少张贴纸

    数组arr中的字符串是贴纸,每种贴纸任选无数张,想要将target串拼出来,至少需要多少张贴纸? 提示:逻辑上比较明了,但是实现上很难的动态规划题目 这个题,特别像一道动态规划的题目,简直就是一模一样 ...

  8. [洛谷]P1434 [SHOI2002] 滑雪

    P1434 [SHOI2002] 滑雪 1.题目 2.分析 3.代码 1.map + dp 70 原因分析:当key相同时,map会覆盖掉先前的值!! 2.优先队列priority_queue + d ...

  9. 简单DP (Preparing for Xtreme 12.0) | STL map使用

    当水题遇上了map大坑 晚上写一个dp,弄了半天样例一直不过,对着队友的代码一行行看,发现跟自己逻辑完全一样啊... 然后就逐行输出比对,发现预处理出了问题,把map插入新值的地方改了下,果然就好了. ...

最新文章

  1. 哪个学校计算机系学大物,计算机系各专业专业及名校介绍
  2. 图形处理相关资源(面部识别、姿态估计、变形、、、)
  3. 编写unit test以及自动化测试WebDriver
  4. 【PAT笔记】C++标准模板库STL(一)——vector的用法和示例
  5. windows常用命令行整理
  6. 【牛客 - 283F】出装方案(最小费用最大流)
  7. 纠删码存储系统中的投机性部分写技术
  8. devops相关书籍哪个好_您在DevOps周期中的哪个位置进行安全保护?
  9. 使用DataWorks调度DLA循环任务
  10. 雅马哈AI系统能自动为舞蹈配乐,跟节奏跳舞时代已不再
  11. Python教学视频(九)math模块的使用
  12. 你必须知道的10项大数据思维原理
  13. html 如何清除历史记录,如何删除网页历史记录?
  14. IT界最伟大的十位人物
  15. jmeter.results.shanhe.me.xsl
  16. 在sweetalert弹出窗插件中加入html代码
  17. MEM/MBA英语基础(02) 句子成分基础
  18. ThreadPool线程池原理
  19. RV32I ISA 汇编指令详解
  20. tmac v6设置中文_给升级到10.6.8后无线BCM43xx不能用的解决办法

热门文章

  1. java开发cgi_編寫CGI小結(Java)
  2. openssl-1.0.1e for arm
  3. ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
  4. educoder平台_22个在线平台,2.4万门网课
  5. python函数和方法的编写原则_跟老齐学Python之传说中的函数编写条规
  6. Web——Request转发和Response重定向
  7. 【转】通过Graph 浏览器体验Microsoft Graph
  8. ABP入门系列(2)——领域层创建实体
  9. eclipse java maven_java – 非常轻量级的Eclipse-Maven集成 – 仅...
  10. android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感