【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)
學習交流加
- 個人qq:
1126137994 - 個人微信:
liu1126137994 - 學習交流資源分享qq群:
962535112
這是一個經典的LIS(即最長上升子序列)問題,請設計一個盡量優的解法求出序列的最長上升子序列的長度。
給定一個序列arr及它的長度n(長度小于等于500),請返回LIS的長度。
測試樣例:
[2,1,5,3,6,4,8,9,7],9
返回:5
分析思路:化簡到子問題,那么這道題應該是化簡到求該序列長度的前1,2,3,4,5,6…n個數的最長上升子序列問題
那么同樣是開辟一個數組dp[n] 這里開辟的是數組還是矩陣,是根據實際情況而來。那么dp[i]就代表必須以arr[i]結尾的情況下,arr[0…i]的最長上升子序列的長度。
由上圖的分析可知:
dp[0]=1;
dp[1] 取決于arr[1]是否大于arr[0] 本題是不大于,所以dp[1]=1;
dp[2]取決于arr[2]是否大于arr[j](j=0~1),大于arr[j]的話,那么就取dp[j]+1的最大值
dp[3]取決于arr[3]是否大于arr[j](j=0~2),大于arr[j]的話,那么就取dp[j]+1的最大值
dp[4]取決于arr[4]是否大于arr[j](j=0~3),大于arr[j]的話,那么就取dp[j]+1的最大值
那么dp[i]的表達式就應該是:
dp[i]=max{dp[j]+1(j=0~(i-1)),且arr[i]>arr[j]}
由以上分析,可寫程序如下:
class LongestIncreasingSubsequence { public:int getLIS(vector<int> A, int n) {// write code hereint dp[n];/* 初始化dp */for(int i=0;i<n;i++){dp[i]=1;}int Max=1;for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(A[i]>A[j]){//注意dp[j]+1這個表達式只能放到判斷語句里面,這樣才不會改變它的值(只做判斷),//如果改變了dp[j]的值,將會影響下一次循環的計算if((dp[j]+1)>dp[i]) dp[i]=dp[j]+1;}}/* 外部每循環一次,則求得了dp[i]的值,選出每次循環后得到的最大值,就是最終需要返回的值 */if(dp[i]>Max)Max=dp[i];;}return Max;} };動態規劃的思想!!!化整體為0,1,2…先計算子問題,再合并計算整體問題!!!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 源码安装NASM,无root权限
- 下一篇: 源码安装libjpeg-turbo1.2