本題的題意就是從長為n的串中擷取一段,把剩下的兩端拼接起來構成乙個可以夠成的最長連續上公升子串行。
首先本題若直接按照題意來先列舉擷取的起點和終點在數一數就需要o(n^3)時間複雜度。n為2*10^5太大。
**預處理就可以避免數一數、
以f(i) 表示以i位置為開頭的連續上公升序列的長度。g(i)表示以i位置為結尾的連續上公升序列的長度。
然後只需優化列舉環節。 可以只列舉右端點,快速找到乙個比之值小而且g(i)盡可能大的點j。
如何做到這一點,觀察i點之前的(a[ j ] , g[ j ]) 二元組,如果 a[ k ] > a[ t ] && g[ i ] 從小到大排序後,特點為以a為長,g值為寬,如同乙個大矩形套著乙個小矩形如此一層層套著。
兩個值都持增勢。所以可以用經典lis 的nlogn方法解題。
#include #include #include #include #include #include #include using namespace std;
const int maxn = 200110;
int n,a[maxn],f[maxn],g[maxn],s[maxn];
int main()
for(int i=n;i>=1;i--){
if(i==n) g[i] = 1;
else if(a[i]
二元組排序(動態規劃)(C )
題目 給定乙個n 2的二維陣列,看作是乙個個二元組,例如 a1,b1 a2,b2 a3,b3 規定,如果想把二元陣列甲放在二元陣列乙上,甲中的a值必須大於乙中的a值,甲中的b值必須也得大於乙中的b值,問,給定乙個二元陣列,問可以羅成這樣的陣列幾個?例 5,4 6,4 6,7 2,3 最多可以羅3個,...
判斷整數序列是不是二元查詢樹的後序遍歷結果
二叉查詢樹 binary search tree 或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。post order 先訪問左節點,再訪問右節點...
判斷整數序列是不是二元查詢樹的後序遍歷結果
第9題 判斷整數序列是不是二元查詢樹的後序遍歷結果 題目 輸入乙個整數陣列,判斷該陣列是不是某二元查詢樹的後序遍歷的結果。如果是返回true,否則返回false。例如輸入5 7 6 9 11 10 8,由於這一整數序列是如下樹的後序遍歷結果 8 6 10 5 7 9 11 因此返回true。如果輸入...