POJ 2533 最大上公升子串行

2021-08-19 21:27:05 字數 662 閱讀 1692

題意很簡單,給出一串數字,求最長的子串行,該子串行需要滿足的要求是:該子串行遞增。

例:輸入1 7 3 5 9 4 8

輸出 4

用a[i]表示輸入的字串

這個題首先分解成子問題,子問題是以a[i]結尾的最長子字串

所以用n[i]表示以a[i]結尾的最長公共子串.

當a[i]大於a[i-1]時,顯然n[i]=n[i-1]+1;

當a[i]小於a[i-1]時,要從前面遍歷,找到比a[i]小的數字裡面對應的n[i]最大的那個,這樣就可以與a[i]拼接成子串。

要注意的一點是,此時的n[i]是max(n[i],n[j]+1) 此處j是比a[i]小的元素。

例 1 3 2 4 5 4 3 2 1對第六個數,也就是第二個出現的4,在遍歷到第二個數字3時,其對應的n[5]=4,而當繼續遍歷的時候,下乙個元素是2,其對應的n[j]+1應該是3,但n[5]顯然不是3,而是4.

**:#include#include#include#includeusing namespace std;

int a[100000];

int n[100000];

int main(){

int num;

while(scanf("%d",&num)){

int i;

for(i=0;i

POJ 2533 最長上公升子串行

題意很簡單,給定一串無序 數列,找其中 嚴格上公升子串行的 長度 開始接觸時 用的dp,but 耗時多,後來又學了一下方法 很簡單 怎麼理解呢?看下面 假裝數列開始就是上公升子串行,放入新數列中 題解中的a 在這之後的每乙個數,滿足上公升條件,放在後面,長度加一 不滿足條件,替換佇列中第乙個大於他的...

POJ 2533 最長上公升子串行

思路 建立乙個dp i 陣列,i表示乙個子串行中最後的乙個元素 也是最大的乙個元素 然後迴圈兩次,時間複雜度o n 2 詳見下面ac 例題 poj 2533 include include include include include include include include include...

LIS最大上公升子列 poj2533

題目大意 最大上公升子列 lis最大上公升子列 樸素演算法 o n n 子問題 每次找到乙個從前面到以i位置為結束的上公升子列,而i位置要往前面找乙個最大的上公升子列dp j 進而把問題規模縮小到j 狀態 dp i 以i位置元素為結束的上公升子列的長度 轉移方程 dp i max dp i dp j...