您的位置:首页 > 其它

POJ 1887 —— Testing the CATCHER 最长下降子序列

2016-03-07 20:47 323 查看
原题:http://poj.org/problem?id=1887

求最长下降子序列个数

注意输出格式!

O(n²)

#include<cstdio>
#include<algorithm>

using namespace std;
int dp[100000000];
int a[100000000];
int cas = 0;
int main()
{
int tmp;
while(~scanf("%d", &tmp))
{
if(tmp == -1)	break;
int cnt = 0;
a[cnt++] = tmp;
while(1)
{
scanf("%d", &tmp);
if(tmp == -1)	break;
a[cnt++] = tmp;
}
for(int i = 0;i<cnt;i++)
dp[i] = 1;
int ans = 1;
for(int i = 1;i<cnt;i++)
{
for(int j = 0;j<i;j++)
{
if(a[i] < a[j] && dp[i] < dp[j] + 1)
dp[i] = dp[j] + 1;
}
ans = max(ans, dp[i]);
}
printf("Test #%d:\n", ++cas);
printf("  maximum possible interceptions: %d\n\n", ans);
}
return 0;
}


O(nlogn)

#include<cstdio>
#define inf 99999999
int stack[100000000];
int cas = 0;

int main()
{
int tmp;
while(~scanf("%d", &tmp))
{
if(tmp == -1)	break;
int top = 1;
stack[1] = tmp;
while(1)
{
scanf("%d", &tmp);
if(tmp == -1)	break;
if(tmp < stack[top])
stack[++top] = tmp;
else
{
int l = 1, r = top;
int mid;
while(l <= r)
{
mid = (l + r) / 2;
if(tmp > stack[mid])
r = mid - 1;
else
l = mid + 1;
}
stack[l] = tmp;
}
}
printf("Test #%d:\n", ++cas);
printf("  maximum possible interceptions: %d\n\n",top);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: