热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

等差数列划分子序列问题DP解决

文章目录题目暴力回溯构建等差数组数学方法优化以等差数列的最后两元素为状态dp题目视频讲解暴力回溯构建等差数组数学方法优化当出现完全一样元素大小的长度很长的数组数组时,

文章目录

    • 题目
    • 暴力回溯构建等差数组+数学方法优化
    • 以等差数列的最后两元素为状态dp


题目

题目描述
视频讲解

暴力回溯构建等差数组+数学方法优化


当出现完全一样元素大小的长度很长的数组数组时,可计算Cn1…Cnn来实现。


超时,差最后一个case

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {using ll &#61; long long;int n &#61; nums.size();if(n<3)return 0;auto check &#61; [&](){int b &#61; nums[0];for(auto t:nums){if(b!&#61;t)return false;}return true;};if(check()){ll res &#61; 1<<n;//减去Cn1-Cn2-Cn0res -&#61; n;res -&#61; n*(n-1)/2;res -&#61; 1;return res;}int cnt &#61; 0;//backtrack维护一个等差数组function<void(vector<ll>&,int)> backtrack &#61; [&](vector<ll>&t,int pos){if(t.size()>2)cnt&#43;&#43;;for(int i&#61;pos;i<n;i&#43;&#43;){if(t.size()<2){t.emplace_back(nums[i]);backtrack(t,i&#43;1);t.pop_back();}else{int sz &#61; t.size();ll gap &#61; t[sz-1] - t[sz-2];if(gap&#61;&#61;(ll)nums[i]-t[sz-1]){t.emplace_back(nums[i]);backtrack(t,i&#43;1);t.pop_back();}}}};vector<ll>q;backtrack(q,0);return cnt;}
};

以等差数列的最后两元素为状态dp


dp[i][j] 表示以 i 和 j 下标对应最后两元素的等差数列个数&#xff0c;所以存在转移关系:dp[i][j] &#43;&#61; dp[j][k]&#43;1,(k;
而k是怎么来的呢?
nums[j] - nums[k] &#61; nums[i] - nums[j] &#61;> nums[k] &#61; 2*nums[j]-nums[i]
一旦存在这样的下标 k 便可进行状态转移

测试案例

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {using ll &#61; long long;int n &#61; nums.size();if(n<3)return 0;unordered_map<ll,vector<int>>check;//记录值对应的下标&#xff0c;由于存在重复&#xff0c;所以用数组存for(int i&#61;0;i<nums.size();i&#43;&#43;){check[nums[i]].emplace_back(i);}int dp[n][n];int res &#61; 0;memset(dp,0,sizeof(dp));for(int i&#61;0;i<n;i&#43;&#43;){for(int j&#61;0;j<i;j&#43;&#43;){ll target &#61; (ll)2*nums[j]-nums[i];vector<int>& t &#61; check[target];for(auto&& k:t){if(k<j)dp[i][j] &#43;&#61; (dp[j][k]&#43;1);}res &#43;&#61; dp[i][j];}}return res;}
};


推荐阅读
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 3.[15]Writeaprogramtolistallofthekeysandvaluesin%ENV.PrinttheresultsintwocolumnsinASCIIbet ... [详细]
  • 本文通过分析一个具体的案例,探讨了64位Linux系统对32位应用程序的兼容性问题。案例涉及OpenVPN客户端在64位系统上的异常行为,通过逐步排查和代码测试,最终定位到了与TUN/TAP设备相关的系统调用兼容性问题。 ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • 利用Node.js实现PSD文件的高效切图
    本文介绍了如何通过Node.js及其psd2json模块,快速实现PSD文件的自动化切图过程,以适应项目中频繁的界面更新需求。此方法不仅提高了工作效率,还简化了从设计稿到实际应用的转换流程。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
author-avatar
Mr何冰_874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有