因為該題序列長度為100000,故用常規dp方法會超時。o(n2)
這裡用二分查詢+貪心思想來解這道題。o(nlogn)
先建立乙個陣列b用來存放規定的最長單調子串行。
接下來遍歷a陣列。
1.如果a[i]大於b的末尾就直接新增在b的末尾。
2.如果a[i]小於b的末尾我們就找到b陣列中最小的大於a[i]的那個數並替換它。這裡用到了貪心思想。查詢的方法用二分查詢。
3.如果等於則不處理。
#include #define maxn 100005
using namespace std;
int a[maxn];
int b[maxn];
int binarysearch(int* c,int n,int e)
return left;
}int main()
} cout<}}
NYOJ 214 單調遞增子串行 二
先開設乙個陣列dp 然後從第乙個數開始列舉,和dp 陣列中的最後乙個元素end 進行比較,如果大於end 直接把這個數接到end 的後面,並且把end 更新為列舉的這個數。如果不大於edn 在dp 陣列中找到第乙個大於這個數的位子 k,並用這個數 替換掉dp k 例如 x 5,dp 則列舉過x 之後...
NYOJ 214 單調遞增子串行 二
單調遞增子串行 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給定一整型數列 0如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入 有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡...
nyoj 214 單調遞增子串行 二
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給定一整型數列 0 如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入 有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡有n個整數,表示數...