給你乙個有n個元素的數列b,你需要從中找到乙個子串行a,a中元素滿足ai解題思路
對於這個問題,我們通常採取動態規劃的方式來解決,設dp[i]為以第i個元素結尾的上公升子串行的長度,dp[1]-dp[n]初始化為1,dp[0]初始化為0,當我們計算dp[i]的結果的時候,前i個結果我們以前計算得出,則我們可以根據前面計算的結果進行轉移,
dp[i] = max(dp[i],dp[j]+1)(1<=jb[j])
樸素的演算法思想如上所述,其時間複雜度為o(n2),但是我們可以對這個演算法進行優化,進一步降低它的時間複雜度。假定我們已經計算完成了前m個元素結尾的上公升子串行的度,其中dp[i]=dp[j],1<=i<=m,1<=j<=m,i != j。如果b[i] < b[j],當我們下一次遇到b[k] > b[j]時,我們即可以選擇b[i]結尾的序列,也可以選擇b[j]結尾的序列,但是由於選擇b[i]並不會影響最優解,因此我們每次都講相同長度下結尾較小的元素保留下來,這樣可以實現o(nlg(n))的時間複雜度。
#include #include #include #include using namespace std;
const int maxn = 100000+5;
const int inf = 0x3f3f3f3f;
int a[maxn];
int g[maxn];//儲存長度為n的上公升子串行的結尾元素
int main()
memset(g,inf,sizeof(g));
int ans = -inf;
for(int i = 0; i/*for(int i = 1;i<=n;i++)
*/cout << ans << endl;
}return 0;
}
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...
最長上公升子串行
最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a1動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度,初始時...