ZOJ2676动态规划优化

本文介绍了一种使用动态规划方法解决寻找斐波那契序列最长子序列的问题,并采用哈希表来优化状态转移过程,将时间复杂度降低到O(n^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题裸的dp方程应该可以写的出来,我记录的状态如下:

现在遇到的最大问题就是转移,裸的转移是O(n)的,直接从前向后扫一遍,找到第一个符合条件的k,这样总的复杂度是枚举加上扫描,是O(n^3)的,明显对n为3000的数据来说太大了,不可取。

后来想到了二叉树,嗯,就是map,在树中维护值为x的最前位置,这样直接通过在树中找a[i]+a[j]的最前位置即可,后来想想也不对,复杂度是O(n^2*logn)的,对于STL的大常数不放心,算了一下3000^2*log3000差不多10^8数量级,会TLE。又开始想转移能不能压缩。

 

最后想到hash的办法,因为转移无非就是在一个序列中找一个x对应的最前位置,直接将x进行hash,对应的hash值的位置存放我们要的x对应的最前位置即可。

 

hash函数乱写的- -

发现其实数据重复的概率不大,没有优化,直接用了。。。

 

这样可以在近似O(1)的时间内找到我们要的值,转移加上枚举就是O(n^2)的了

 

我的代码:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值