
动态规划
Prince1Alexander
这个作者很懒,什么都没留下…
展开
-
求最长下降子序列的长度的小技巧
当我们学会了最长上升子序列长度的求法后,只需要改动一点点就可以求出最长下降子序列的长度了: 最长上升子序列的所有元素全加上负号不就变成最长下降子序列(LDS)了! 如果想求LDS的长度,直接把所有元素加上负号,然后求LIS的长度,求得的就是LDS的长度! int LDSOnlogn() { dp[1] = -a[1]; int maxlen = 1; int pos; for(int i=2 ; i<=n ; i++) { if( -a[i] &原创 2021-02-21 17:42:58 · 601 阅读 · 0 评论 -
HDU1025-最长上升子序列(LIS)模板题+O(nlogn)二分查找优化
题目链接 题目大意:在两条平行线间连点,要在线不交叉的前提下尽可能多的连线,问最多能连多少条线。 这题是最长上升子序列(LIS)模板题,我们先给出最基础的O(n2)O(n^2)O(n2)动态规划算法: 设a为一个序列,a[i]为序列a从左往右第i个元素;设dp[i]为----序列a中以元素a[i]结尾的所有子序列中的最大上升子序列 状态转移方程: dp[i] = max { dp[j] | j<i 且 a[j]<a[i] } + 1 ,( i从1到n,j从1到i-1 ) 模板如下: in原创 2021-02-20 18:20:20 · 258 阅读 · 0 评论 -
POJ 2111 Millenium Leapcow(记忆化搜索+dfs记录路径)
题目链接 思路 对N*N网格中所有点进行搜索(dfs),搜索过程中对每一步进行记忆化存储,即dp数组保存从当前点开始可获得的最高得分,若后面需要用到前面计算过的数据,直接读取dp数组即可。 dp[i][j]表示从点(i,j)出发可获得的最高得分。 由于本题需要输出最小的路线,所以在搜索过程中要注意,得分相同的两条路要考虑所在点的数字大小。 路径的记录用结构体保存。 不要忘了比较得分相同的起点中,哪个点的数字最小! 代码: #include <iostream> #include <c原创 2021-02-16 09:53:23 · 213 阅读 · 0 评论 -
HDU1041 Computer Transformation
A sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1. So, after the first time s原创 2021-02-04 09:33:11 · 134 阅读 · 0 评论