字符串应用之最长上升字序列LIS
来源:互联网 发布:淘宝进口奶粉 实体店买 编辑:程序博客网 时间:2024/04/29 05:51
用LCS解决LIS问题
最长上升子序列有它的套路,不过用LCS算法是可以解决的:
假设原序列为
第一步:现在对原序列进行排序得到排序后的序列
第二步:考虑原序列
第三步:对
好,这个算法在LeetCode是Memory Limit
代码
class Solution { public: int lengthOfLIS(vector<int>& nums) { vector<int>copied_nums(nums.begin(),nums.end()); //排序 sort(copied_nums.begin(),copied_nums.end()); //去重 copied_nums.erase( unique(copied_nums.begin(),copied_nums.end()), copied_nums.end()); int m=nums.size(); int n=copied_nums.size(); vector<vector<int>>dp(m+1,vector<int>(n+1)); //计算LCS for(int i=0;i<m;++i) { for(int j=0;j<n;++j) { if(nums[i]==copied_nums[j]) { dp[i+1][j+1]=dp[i][j]+1; } else { dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]); } } } return dp[m][n]; } };
LIS动态规划
LIS还是有它的套路,比如动态规划方程如下:
注意这里的
有了动归方程,再根据动归方程算出的局部最优解求全局最优就很EZ了。
class Solution {public: int lengthOfLIS(vector<int>& nums) { int m=nums.size(); if(0==m||1==m) return m; vector<int>L(m); L[0]=1; int curMax; int res=0; for(int i=1;i<m;++i) { curMax=0; for(int j=0;j<i;++j) { if(nums[i]>nums[j]) { curMax=max(curMax,L[j]); } } L[i]=curMax+1;//局部最优 res=max(L[i],res);//全局最优 } return res; }};
1 0
- 字符串应用之最长上升字序列LIS
- 最长上升子序列LIS
- 最长上升子序列LIS
- 最长上升子序列(LIS)
- 最长上升子序列 LIS
- 最长上升子序列(LIS)
- LIS最长上升子序列
- 最长上升子序列 LIS
- 最长上升子序列LIS
- LIS最长上升子序列
- 最长上升子序列LIS
- 最长上升序列模板 LIS
- LIS 最长上升子序列
- 最长上升子序列LIS
- LIS(最长上升子序列)
- LIS 最长上升子序列
- lis 最长上升子序列
- LIS-最长上升子序列
- HDU 3783 ZOJ
- 160 - 5 ajj.2
- laravel5.4 npm 报错(node-sass 安装卡在 node scripts/install.js 解决办法)
- 关于青岛地图下钻
- [排序算法]--直接插入排序的三种实现(Java)
- 字符串应用之最长上升字序列LIS
- UITableView多选Cell操作
- windows下使用USB2Dynamixel修改舵机ID和波特率的方法
- jdk jre jvm区别与联系
- 安卓模拟位置之夜神模拟器
- linux命令---查看系统版本
- 根据手机屏幕分辨率设置组件或控件的大小,利用像素更好的适配不同尺寸的机型的动态布局
- leetcode 54. Spiral Matrix
- winfrom-绘制矩形并移动