原题: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;
}