这道题裸的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)的了
我的代码: