96SEO 2026-02-20 05:33 5
。

这个策略的核心思想就是将问题分解为一系列的小问题#xff0c;并将每个小问题的解保存起来。
这样#xff0c;当我们需要解决原始问题的时候#xff0c;我们就可以直接利…动态规划
动态规划就像是解决问题的一种策略它可以帮助我们更高效地找到问题的解决方案。
这个策略的核心思想就是将问题分解为一系列的小问题并将每个小问题的解保存起来。
这样当我们需要解决原始问题的时候我们就可以直接利用已经计算好的小问题的解而不需要重复计算。
case首先证明命题在最小的基础情况下成立。
通常这是一个较简单的情况可以直接验证命题是否成立。
step假设命题在某个情况下成立然后证明在下一个情况下也成立。
这个证明可以通过推理推断出结论或使用一些已知的规律来得到。
通过反复迭代归纳步骤我们可以推导出命题在所有情况下成立的结论。
在动态规划中首先得到状态在最小的基础情况下的值然后通过状态转移方程得到下一个状态的值反复迭代最终得到我们期望的状态下的值。
接下来我们通过三道例题深入理解动态规划思想以及实现动态规划的具体步骤。
我们可以很容易得到这样一个状态表示定义dp[i]表示以i位置为结尾的最长的等差子序列的长度。
我们针对于以i位置元素为结尾的等差子序列以及i位置元素进行分析想一想dp[i]能不能由其他状态推导得出。
那么i位置元素可能跟在前面0~i-1中任意满足arr[i]-arr[j]difference的元素后面0ji-1)对于确定的一个j值此时dp[i]dp[j]1意味着j位置元素和i位置元素构成等差子序列。
所以dp[i]maxdp[i],dp[j]1需要在0~i-1这些状态中找到最大的值存储在dp[i]中。
因为dp[i]的取值需要在自己和前面的值中选取最大的一个并且是赋值所以在最开始的赋值中自己必须有初始值。
在自己初始化的前提下dp[i]一定会被赋值为一个大于1的值所以就不会取到第一种情况。
综上所述我们需要初始化所有位置状态为1保证dp[i]最开始有初始值同时状态初始化为1是最长等差子序列的最低标准把只有自己一个元素的情况考虑进去了。
根据状态转移方程我们知道想要推导出i位置的状态需要用到0~i-1位置的状态所以我们需要初始化第一个位置的状态即dp[0]1。
根据在状态转移方程的分析我们需要将所有位置状态初始化为1结合起来得到初始化
根据状态转移方程我们知道想要推导出i位置状态需要运用到0~i-1位置的状态所以我们需要从左往右填写保证在推导i位置的状态时0~i-1位置的状态都已经得到。
结合题目意思我们需要得到所有等差子序列中长度最长的长度值所以我们需要遍历dp表找到长度最长的长度值然后返回。
我们进行优化最外层的循环是一定优化不了的因为我们必须遍历dp表一遍去填写每一个值所以我们希望优化内循环看看能不能降低时间复杂度。
我们内循环的作用是对于i位置的元素遍历所有可能构成的等差序列找到最大长度然后赋值给dp[i]。
如果hash表下标记录元素值hash值记录最长的等差序列的长度这样就可以实现优化。
既然hash值存储的是长度即dp那么我们就做到将(元素dp进行绑定。
就不需要dp数组了。
我们可以很容易得到这样一个状态表示定义dp[i]表示以i位置为结尾的最长的斐波那契子序列的长度。
我们针对于以i位置元素为结尾的斐波那契子序列以及i位置元素进行分析想一想dp[i]能不能由其他状态推导得出。
因为斐波那契子序列最少要含有三个元素所以实际上dp[i]应该为0如果dp[i]为零没办法区分i位置元素最多和前面0个元素构成斐波那契子序列还是和前面1个元素构成斐波那契子序列因此我们这里dp[i]存储1表示只能和前面0个元素构成斐波那契子序列而只需要判断dp[i]的值是不是小于3就知道这个值的含义。
i位置元素可能跟在前面的任意位置元素后面0~i-1定义0ji-1)针对j位置元素如果i位置元素和j位置元素构成斐波那契子序列那么arr[i]arr[j]前一个元素但我们不知道以j位置元素结尾的最长子序列前一个元素是不是我们希望的那个元素所以这个状态表示不足以推导出状态转移方程。
我们可以修正一个状态转移方程定义dp[i][j]表示以i位置和j位置为结尾的所有子序列中最长的斐波那契子序列长度。
固定了最后两个位置的斐波那契子序列就可以推导出前一个位置的元素即arr[j]-arr[i]。
以arr[j]-arr[i]这个元素对应下标位置和i位置结尾的所有子序列中最长的斐波那契子序列长度是dp[x][i]就可以推导出状态转移方程。
因此状态表示为定义dp[i][j]表示以i位置和j位置为结尾的所有子序列中最长的斐波那契子序列长度。
dp[i][j]表示以i位置和j位置为结尾的所有子序列中最长的斐波那契子序列长度。
我们针对于以i、j位置元素为结尾的斐波那契子序列进行分析想一想dp[i][j]能不能由其他状态推导得出。
假设arr[i]b,arr[j]c,那么这个序列前一个元素就是ac-b。
我们根据a的情况进行讨论
假设a的下标为k此时以i、j位置为结尾的最长斐波那契子序列长度为以ki位置为结尾的最长斐波那契子序列长度1。
即dp[i][j]dp[k][i]1。
假设a的下标为k此时k介于i和j之间所以这种情况不成立此时dp[i][j]2。
如果a存在且abdp[i][j]dp[k][i]1其他情况dp[i][j]2所以我们可以把其他情况放到初始化步骤进行解决全部状态初始化为2即可。
这样就只需要考虑一种情况。
这样我们就可以快速通过a元素值找到对应的下标并且可以快速知道arr数组中是否存在a元素。
根据状态转移方程我们知道在推导ij位置的状态时可能要用到0~i-1i位置的状态所以我们初始化最基础的最小的解推导第二个状态1,2位置的状态时需要初始化0~1-1i即dp[0][1]2。
根据状态转移方程我们知道在推导ij位置的状态时可能要用到0~i-1i位置的状态所以在填写ij位置的状态时ki位置的状态必须已经填写好(0ki-1)。
如果固定j填写i我们需要用到的是(k,i)i对应的状态应该已经全部填写所以j应该从小到大变化。
此时i的变化可以从小到大也可以从大到小。
如果固定i填写j我们需要用到的是(k,i)k对应的状态应该已经全部填写所以i应该从小到大变化。
此时j的变化可以从小到大也可以从大到小。
dp[i][j]表示以i位置和j位置为结尾的所有子序列中最长的斐波那契子序列长度。
结合题目意思我们需要返回最长斐波那契子序列长度但我们不知道最长的斐波那契子序列以哪两个位置结尾所以我们需要遍历dp表找到最大值然后返回。
我们可以很容易得到这样一个状态表示定义dp[i]表示以i位置为结尾的最长的等差子序列的长度。
我们针对以i位置为结尾的等差子序列进行分析想一想dp[i]能不能由其他状态推导得出。
i位置元素可以跟在前面任意一个元素后面定义0ji-1)但是我们不知道dp[j]代表的最长等差子序列长度所对应的等差子序列公差是多少没办法确定是否可以使得ji位置构成的等差子序列和以j位置结尾的最长等差子序列长度对应的等差子序列公差相等。
所以这个状态表示不足以推导出状态转移方程。
我们可以修正状态表示定义dp[i][j]表示以ij为结尾的等差子序列最长的长度值。
因为我们只需要根据arr[i]、arr[j]两个元素就知道以ij位置结尾的等差子序列长什么样子就可以推导出该等差子序列前一个元素值,因为arr[i]-xarr[j]-arr[i]所以x2*arr[i]-arr[j]。
定义dp[i][j]表示以ij为结尾的等差子序列最长的长度值。
此时我们需要以ki位置结尾的最长等差子序列再加上j位置元素就是以ij为结尾的最长等差子序列长度即dp[i][j]dp[k][i]1。
此时不满足等差子序列的定义所以不考虑这种序列即dp[i][j]2。
将上述情况进行合并和简化如果a存在且kidp[i][j]dp[k][i]1。
其他情况dp[i][j]2所以我们可以将dp表初始化为2只用考虑a存在且ki的情况。
这样我们就可以快速通过a元素值找到对应的下标并且可以快速知道arr数组中是否存在a元素。
(hash.count(a)hash[a]i)dp[i][j]
根据状态转移方程我们知道推导ij位置状态时可能用到ki位置状态而0ki-1)所以我们初始化最基础的最小的解推导第二个状态1,2位置的状态时需要初始化0~1-1i即dp[0][1]2。
根据状态转移方程我们知道推导ij位置状态时可能用到ki位置状态0ki-1)所以此时ki位置的状态应该已经得到。
如果固定j填写i我们需要用到的是(k,i)i对应的状态应该已经全部填写所以j应该从小到大变化。
此时i的变化可以从小到大也可以从大到小。
如果固定i填写j我们需要用到的是(k,i)k对应的状态应该已经全部填写所以i应该从小到大变化。
此时j的变化可以从小到大也可以从大到小。
结合题目意思我们需要返回等差子序列最长的长度值但是我们不知道最长的等差子序列是以哪两个位置结尾所以我们需要遍历dp表找到最大值进行返回。
longestArithSeqLength(vectorint
今天我们学习了动态规划的思想动态规划思想和数学归纳法思想有一些类似动态规划在模拟数学归纳法的过程已知一个最简单的基础解通过得到前项与后项的推导关系由这个最简单的基础解我们可以一步一步推导出我们希望得到的那个解把我们得到的解依次存放在dp数组中dp数组中对应的状态就像是数列里面的每一项。
最后感谢您阅读我的文章对于动态规划系列我会一直更新如果您觉得内容有帮助可以点赞加关注以快速阅读最新文章。
最后感谢您阅读我的文章希望这些内容能够对您有所启发和帮助。
如果您有任何问题或想要分享您的观点请随时在评论区留言。
同时不要忘记订阅我的博客以获取更多有趣的内容。
在未来的文章中我将继续探讨这个话题的不同方面为您呈现更多深度和见解。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback