自从和DP杠上,从上一次写博开始,到这一次为止,终于堂堂正正的A出来一道了。
现在手上还有两道莫名其妙的WA
诶。
这道题,其实就是求单调递增子序列。
由于测试数据比较大,所以不能用传统的解法。
需要用二分搜索来优化。
具体解法先立一个flag 等期末考试完了就填上。
题目链接:hdu 1950
先附上AC代码:
#include<iostream>
using namespace std;
#define N 40000
int n;
int num[N];
int dp[N];
int getLoc(int start,int end,int now){
int mid;
while (start <= end){
mid = (start + end) / 2;
if (dp[mid] > now){
end = mid - 1;
}
else if (dp[mid] < now){
start = mid + 1;
}
else{
return mid;
}
}
return start;
}
int getMost(){
int max = 0;
int i;
dp[0] = num[0];
max++;
i = 1;
while (i < n){
if (num[i]>dp[max - 1]){
dp[max] = num[i];
max++;
}
else{
int index = getLoc(0, max - 1, num[i]);
dp[index] = num[i];
}
i++;
}
return max;
}
int main(){
int tcase;
int i;
cin >> tcase;
while (tcase--){
cin >> n;
for (i = 0; i < n; i++){
cin >> num[i];
}
int result = getMost();
cout << result << endl;
}
return 0;
}