热门标签 | 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;}
};


推荐阅读
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 本文详细探讨了在PHP中实现毫秒级时间戳的技术方案,重点讲解了如何处理 `microtime` 函数的返回值以获取高精度时间戳。通过具体的示例代码,展示了该方法的简便性和实用性,适合需要精确时间记录的应用场景。 ... [详细]
  • 在Android开发中,实现多点触控功能需要使用`OnTouchListener`监听器来捕获触摸事件,并在`onTouch`方法中进行详细的事件处理。为了优化多点触控的交互体验,开发者可以通过识别不同的触摸手势(如缩放、旋转等)并进行相应的逻辑处理。此外,还可以结合`MotionEvent`类提供的方法,如`getPointerCount()`和`getPointerId()`,来精确控制每个触点的行为,从而提升用户操作的流畅性和响应性。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • 贪心策略在算法设计中的应用与优化
    贪心算法在算法设计中具有广泛的应用,特别是在解决优化问题时表现出色。本文通过分析经典问题“买卖股票的最佳时机II”,探讨了贪心策略的基本原理及其在实际问题中的应用。通过实例分析,展示了贪心算法如何通过局部最优选择逐步达到全局最优解,并讨论了其在时间和空间复杂度上的优势。此外,还提出了一些优化方法,以提高算法的效率和适用性。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
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社区 版权所有