給出長度為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...