您的位置:首页 > 其它

POJ 3903 Stock Exchange

2015-08-21 12:21 204 查看

原题链接:

http://poj.org/problem?id=3903

题目大意:

找一个最大递增子序列

思路:

由于这题数据量较大,如果按照递增子序列的一般写法,会超时。所以这里要在筛选dp的时候做出优化—二分查找

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int tp[100010];
int dp[100010];//以i位置为结尾的最后一项的值

int main()
{
int L;
while( scanf("%d",&L) != EOF )
{
int i;
for( i = 0; i < L; i++ )
scanf("%d",&tp[i]);
dp[0] = tp[0];
int len = 1;
for( i = 1; i < L; i++ )
{
int left = 0, right = len - 1,mid;
if( dp[len-1] < tp[i] )
dp[len++] = tp[i];
else
{
right = len - 1;
while( left <= right )
{
mid = ( left + right ) / 2;
if( dp[mid] < tp[i] )
left = mid + 1;//找到的值小。继续向右方找
else
right = mid - 1;//找到的值大。继续向左边找
}
dp[left] = tp[i];//最终找到的值是在所有比当前值小的之中的最大值
}
}
printf("%d\n",len);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 优化 二分查找