题目链接:
POJ 2533:http://poj.org/problem?id=2533
POJ 1631:http://poj.org/problem?id=1631
Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
Source
LIS果题。
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
int N;
int ans;
int a[1017], dp[1017];
int bin(int len, int tem)
{
int l = 1, r = len;
while(l <= r)
{
int mid = (l+r)/2;
if(tem > dp[mid])
l = mid+1;
else
r = mid-1;
}
return l;
}
int LIS(int *b)
{
dp[1] = a[1];
ans = 1;
int k;
for(int i = 2; i <= N; i++)
{
if(a[i] < dp[1])
k = 1;
else if(a[i] > dp[ans])
k = ++ans;
else
k = bin(ans,a[i]);
dp[k] = a[i];
}
return ans;
}
int main()
{
while(~scanf("%d",&N))
{
for(int i = 1; i <= N; i++)
{
scanf("%d",&a[i]);
}
LIS(a);
printf("%d\n",ans);
}
return 0;
}POJ 1631 和这题基本上一样,只需改一下数组大小,叫一个多测试案例输入的循环即可!
这里也贴一下代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
int N;
int ans;
int a[40017], dp[40017];
int bin(int len, int tem)
{
int l = 1, r = len;
while(l <= r)
{
int mid = (l+r)/2;
if(tem > dp[mid])
l = mid+1;
else
r = mid-1;
}
return l;
}
int LIS(int *b)
{
dp[1] = a[1];
ans = 1;
int k;
for(int i = 2; i <= N; i++)
{
if(a[i] < dp[1])
k = 1;
else if(a[i] > dp[ans])
k = ++ans;
else
k = bin(ans,a[i]);
dp[k] = a[i];
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&N);
for(int i = 1; i <= N; i++)
{
scanf("%d",&a[i]);
}
LIS(a);
printf("%d\n",ans);
}
return 0;
}poj 2533 & poj 1631 Longest Ordered Subsequence( LIS果题 )
原文地址:http://blog.csdn.net/u012860063/article/details/39001081