国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

字符串應(yīng)用之最長上升字序列LIS

2019-11-11 05:55:13
字體:
供稿:網(wǎng)友

用LCS解決LIS問題

最長上升子序列有它的套路,不過用LCS算法是可以解決的: 假設(shè)原序列為A 第一步:現(xiàn)在對原序列進(jìn)行排序得到排序后的序列B 第二步:考慮原序列A可能有重復(fù)元素,對序列B還要進(jìn)行去重得到序列B′ 第三步:對AB′做LCS運(yùn)算,即可得出原序列A的LIS最長上升子序列。

好,這個(gè)算法在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)); //計(jì)算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動(dòng)態(tài)規(guī)劃

LIS還是有它的套路,比如動(dòng)態(tài)規(guī)劃方程如下: dp(i)=dp(j)max+1,0≤j<i,aj<ai 注意這里的dp(i)是一個(gè)局部最優(yōu),表示當(dāng)LIS以ai結(jié)尾時(shí)的最優(yōu),因此我們首先要從0 i?1找一各滿足aj<ai條件的局部最優(yōu),再在后面補(bǔ)上ai即是當(dāng)前局部最優(yōu)。

有了動(dòng)歸方程,再根據(jù)動(dòng)歸方程算出的局部最優(yōu)解求全局最優(yōu)就很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;//局部最優(yōu) res=max(L[i],res);//全局最優(yōu) } return res; }};
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 三都| 板桥市| 武陟县| 绥化市| 博白县| 读书| 那曲县| 扶沟县| 莒南县| 会同县| 广饶县| 广平县| 齐齐哈尔市| 洞口县| 西藏| 历史| 手机| 裕民县| 西盟| 定南县| 竹山县| 盘山县| 沭阳县| 太白县| 阳原县| 平塘县| 江陵县| 含山县| 平阴县| 濮阳县| 龙海市| 海原县| 禄丰县| 新绛县| 凉城县| 雅安市| 宝鸡市| 西城区| 曲沃县| 民和| 汉寿县|