例題:
題解:該題很資料量很大用傳統的動態規劃演算法寫,會tle,所以需要用二分優化演算法,我們可以定義乙個棧stack
,可以說是單調棧,利用二分查詢,保持棧的單調行,從一層for迴圈裡找到每乙個ans
所在的位置
以樣例1為例:
1231910
511213
stack[1]
=a[0
]先把第乙個值入棧
4519
1011
13這是最大的遞增子串行,而二分思路是記錄了a[ ]
中每乙個的位置
ac**:主要操作:
一開始先入棧
stack:[1
][9]
[10]第四個數5二分查詢它的位置是2,替代9此時說明以5為尾的最大長度是2,之後不斷更
新入棧多少個最大長度就是top的大小
#include
.h>
using namespace std;
//二分優化最長遞增子串行
#define maxn 100005
int stack[maxn]
;int a[maxn]
;int n;
intlower_ans
(int l,
int r,
int i)
//返回剛好比l大1的位置
else
}return l;
}void
slove_dp()
else
}printf
("%d\n"
,top);}
intmain()
slove_dp();}}
最長遞增子串行!!!(DP ,二分)
最長遞增子串行 time limit 1000 ms memory limit 32768 k total submit 158 64 users total accepted 68 56 users rating special judge no description 給出乙個數字序列求其最長的...
NYOJ 214 單調遞增子串行 二 (二分優化)
描述給定一整型數列 0如 1 9 10 5 11 2 13的最長單調遞增子串行是1 9 10 11 13,長度為5。輸入有多組測試資料 7 每組測試資料的第一行是乙個整數n表示序列中共有n個整數,隨後的下一行裡有n個整數,表示數列中的所有元素.每個整形數中間用空格間隔開 0 include usin...
NYOJ 214 單調遞增子串行 二
先開設乙個陣列dp 然後從第乙個數開始列舉,和dp 陣列中的最後乙個元素end 進行比較,如果大於end 直接把這個數接到end 的後面,並且把end 更新為列舉的這個數。如果不大於edn 在dp 陣列中找到第乙個大於這個數的位子 k,並用這個數 替換掉dp k 例如 x 5,dp 則列舉過x 之後...