1134 最長遞增子串行

2021-08-02 00:04:31 字數 1685 閱讀 2057

給出長度為n的陣列,找出這個陣列的最長遞增子串行。(遞增子串行是指,子串行的元素是遞增的)

例如:5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。

input

第1行:1個數n,n為序列的長度(2 <= n <= 50000)

第2 - n + 1行:每行1個數,對應序列的元素(-10^9 <= s[i] <= 10^9)

output

輸出最長遞增子串行的長度。

input示例

8 5

1 6

8 2

4 5

10 output示例

5 思路一: 建立乙個陣列a來儲存所給的值,建立乙個陣列b來儲存一種到a[i]的最長的情況(裡面很有可能不是有序的)。之後通過查詢a[i]位置,將其放入b這個陣列按照公升序應該在的位置上。畢竟我們要的是長度,無關乎裡面的資料,如果後來的資料覆蓋導致已經沖毀了原來的len,這是我們應該重新整理len。這樣我們就可以得到max_len;

思路二:直接不用儲存a[i],直接接收乙個數,處理乙個數

1.

#include

#include

typedef

long

long ll;

#define n 50010

using

namespace

std;

int search_val(int *b,int len,int val);

int lis(ll *a,int *b,int n)

else

}return len;

}//查詢a[i]應該在b[i]中的位置

int search_val(int *b,int len,int val)

return left;

}int main()

max_len = lis(a,b,n);

printf("%d\n",max_len);

return0;}

2.//簡化版

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=10010;

int num[maxn];

int test[maxn];

int main()

test[l]=num[i];}}

printf("%d\n",len);

return

0;}

動態規劃:每次都去查詢,前面比當前數小的值裡最長增長的序列。

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=10010;

int num[maxn];

int dp[maxn];

int main()

}printf("%d\n",ans);

return

0;}

1134 最長遞增子串行

1134 最長遞增子串行 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n...

1134 最長遞增子串行

1134 最長遞增子串行 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n...

1134 最長遞增子串行

1134 最長遞增子串行 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n...