問題描述:
求乙個一維陣列的最長遞增子串行,時間複雜度盡可能小。
例如:陣列 1, -1,2,-3,4,-5,6,-7它的最長遞增子串行是 1,2,4,6,最後返回4.
很經典的問題了,昨天面試的時候還被問道了,可是沒答上來。
這是乙個典型的動態規劃問題,思路如下:定義乙個陣列psub[i]用於儲存從元素0到元素i的最長遞增的長度,然後考慮第i+1個元素,從0到i進行比較若有i+1>i且psub[i]+1>psub[i+1],那麼psub[i+1]=psub[i]+1;
**如下:
int maxlengthsub(vectornums)
return ret;
}
或是這樣;
int maxlengthsub2(vectornums)
cout上面兩個**思路都是相同的。不同的是第乙個用到了vector容器,逼格高一點點。不過用vector的時候要記得,對於乙個新元素要進來的時候用:
temp.push_back(1);
而不可以直接:temp[i]=1;
乙個拓展題目:
造橋問題. 原題是這樣:building bridges. (英文題意略,寫了也不會看的)大致就是要在一條河的南北兩邊的各個城市之間造若干座橋.橋兩邊的城市分別是a(1)…a(n)和b(1)…b(n).這裡的要求a(i)只可以和b(i)之間造橋,同時兩座橋之間不能交叉.希望可以得到乙個盡量多座橋的方案.如下圖所示:
感覺拿到手一臉的蒙蔽狀,不知道這個這東西到底跟動態規劃有毛的關係?不要急,有個不要臉的曾說是過:急事緩做。咱們一步步的分析:
首先上北下南;對於南邊的編號:s1=;北邊的編號:s2=;然後從南邊的第一座橋開始計算在北邊序列中的index.也就是s1中的每個值相對於s2中的位置.比如說a2在南邊是第乙個在北邊是第二個,所以第乙個元素是2.a1在北邊的對應位置是1.a3在北邊的對應位置是5,a5在北邊的對應位置是3,最後乙個a4在北邊的對應位置是3.這樣我們就得到乙個新的序列s3= .這個序列的實際意義就是南邊的第幾座橋需要連線到北邊的第幾座橋。
下面開始分析s3,s3是根據北面的橋所對應的位置(從左到右,從1到5排序)而得到的,也就是說s3中的數字所有一定的位置關係的,s3中的數對應著這s1的位置,比如s3中的第三個數表示s1中第3個位置的數;那麼是不是有點像乙個以1為起始陣列呢?是不是有點靠近動態規劃的意思了呢?咱們再進一步的分析一下,取s3中的兩個數並假設這兩個數對應的下標所,那麼這{5,3}在上例建橋中就表示1與5相連,2與3相連;這樣的話就會出現交叉連線的情況了,因此就不符合題意了。
呼呼,講了半天,其實所說只有當s3中前面的數子不大於後面的數字的時候這樣的橋才所可以建的,那麼也就是說我們的造橋問題就轉化成了尋找這個序列的最長遞增子串行的問題!噹噹當,驚不驚喜,奇不奇妙~
**如下:
vectormaxlengthsub(vectornums)
//上面就得到了temp儲存著最長子序列的長度
//下面所獲取最長子序列所對應的數
vectorresult;
for(int i=nums.size()-1;i>0 && ret>0;i--)
}return result;
}//對資料的預處理,以及得到資料之後的後處理
vectorgetmaxnum(vectors1,vectors2)}}
return result;
}
動態規劃 最長遞增子串行
給出序列 1 2 3 4 2 5 3 4 a 1 1,a 2 2,a 7 3,a 8 4 求其最長的遞增子串行,以上最長遞增子串行為 1 2 3 4 5 問題細分 初始化條件f 1 1,序列只有1個長度即為1 f 2 a 2 與下標小於2的比較,即a 1 比較,a 2 a 1 因此更新f 2 f 1...
動態規劃 最長遞增子串行
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度 例項 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行為 2,3,7,101 長度為4說明 可能會有多種最長上公升子串行的和,只需要輸出對應長度即可 演算法的時間複雜度應為o n2 首先,dp陣列的定義如下 dp...
動態規劃 最長遞增子串行
最長遞增子串行是動態規劃中最經典的問題之一,該問題描述的是在乙個已知序列中,取出若干元素 不必連續 組成乙個新的序列,子串行的各個數先後順序保持不變,且對子序列中的任意下標x令dp i 表示以a i 作為末尾的最長遞增子串行的長度。於是,通過設定這麼乙個陣列,最長遞增子串行的長度便是陣列dp中的最大...