題目位址
描述給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。
輸入格式
第一行包含整數n。
第二行包含n個整數,表示完整序列。
輸出格式
輸出乙個整數,表示最大長度。
資料範圍
1≤n≤1000,
−109≤數列中的數≤109
輸入樣例:
73 1 2 1 8 5 6
輸出樣例:
4法1: 用f[i] 表示 數列中以i為結尾的最長嚴格單調遞增的子串行的最長長度,則有當 a[i] > a[j] 中的乙個數時 ,有f[i] = max(f[i],f[j] + 1),相當於可以把a[i] 這個數 接到 a[j] 後面得到的長度。
故有,每次遍歷到第i位置的時候,都可以往前面遍歷找到乙個比他小的,更新f。
c++,**如下:
#include
using
namespace std;
typedef pair<
int,
int> pii;
typedef
long
long ll;
const
int inf =
0x3f3f3f3f
;const
double eps =
1e-5
;const
int mod =
1e9+7;
const
int n =
1010
;//n^2
//f[i] 存當前i號位置為尾最長上公升序列
int a[n]
,f[n]
;int
main()
int res =0;
for(
int i=
1;i<=n;i++
) res =
max(res,f[i]);
cout
}
方法2:用lower_bound將當前的a[i]修改到乙個已經構建上公升序列中(開始為空)。,最大長度就是最長上公升子串行。理由:若當前的a[i]是最大的,則會被加入到最後。若不是最大的,則會更新上公升序列中的某個值。會不會有影響??? 不會。對於乙個已經形成了的上公升序列,後面的值接到末尾,本身就無影響。 當把序列中的某個數更新後,最大長度沒變,序列元素改變,整體不是乙個子串行,但可以把當前更新的元素近似改變為原來的那個數,就很好理解了。更新是為了後序序列更好處理,因為結尾越小,後面的值就越容易修改。為什麼不是插入呢?而是修改,如果是插入,則會造成不是乙個子串行。
(講的繞,看看例子吧)
例如: 1 2 4 7 3 5 6 9 8
11 2
1 2 4
1 2 4 7
1 2 3 7 -> 此時應該把1->2->3看成乙個真正子串行,1->2->3 == 4->7近似看成上乙個子串行,假設是插入的話 1 2 3 4 7,這不是子串行了.
1 2 3 5
1 2 3 5 6
1 2 3 5 6 9
1 2 3 5 6 8
故為6c++**如下:
#include
using
namespace std;
typedef pair<
int,
int> pii;
typedef
long
long ll;
const
int inf =
0x3f3f3f3f
;const
double eps =
1e-4
;const
int mod =
100003
;const
int n =
1000010
;int q[n]
;int
main()
cout
}
有錯誤還請斧正。 最長上公升子串行
問題描述 乙個數的序列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結尾的最長上公升子串行的長度,初始時...