题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=214
题目解析:此题可以dp解决,但是数据大时会超时,也可以用另一种方法解决。
代码如下:
超时代码:
01.
#include<cstdio>
02.
#include<cstring>
03.
#include<algorithm>
04.
using
namespace
std;
05.
int
a[100010];
06.
int
dp[100010];
07.
08.
int
main()
09.
{
10.
int
n;
11.
while
(
scanf
(
"%d"
,&n)!=EOF)
12.
{
13.
for
(
int
i=1;i<=n;i++)
14.
scanf
(
"%d"
,&a[i]);
15.
memset
(dp,0,
sizeof
(dp));
16.
for
(
int
i=1;i<=n;i++)
17.
{
18.
dp[i]=1;
19.
for
(
int
j=1;j<=i;j++)
20.
{
21.
if
(a[j]<a[i])
22.
dp[i]=max(dp[i],dp[j]+1);
23.
}
24.
}
25.
int
ans=dp[1];
26.
for
(
int
j=2;j<=n;j++)
27.
{
28.
if
(dp[j]>ans)
29.
ans=dp[j];
30.
}
31.
printf
(
"%d\n"
,ans);
32.
}
33.
return
0;
34.
}
01.
#include<cstdio>
02.
#include<cstring>
03.
#include<algorithm>
04.
using
namespace
std;
05.
06.
int
s[100006];
07.
int
main()
08.
{
09.
int
n;
10.
while
(
scanf
(
"%d"
,&n)!=EOF)
11.
{
12.
memset
(s,0,
sizeof
(s));
13.
int
top=1;
14.
int
t;
15.
scanf
(
"%d"
,&t);
16.
s[top]=t;
17.
for
(
int
i=2;i<=n;i++)
18.
{
19.
scanf
(
"%d"
,&t);
20.
if
(t>s[top])
21.
{
22.
top++;
23.
s[top]=t;
24.
}
25.
else
//二分,如果前面有与t相等的,就替换,否则找到一个刚好比t小的然后替换,保证
26.
// 整个序列是有序的,并且相对来说是最小的,为了给后面留下更多的空间
27.
{
28.
int
low=1;
29.
int
high=top;
30.
while
(low<=high)
31.
{
32.
int
mid=(low+high)/2;
33.
if
(t>s[mid])
34.
low=mid+1;
35.
else
36.
high=mid-1;
37.
}
38.
s[low]=t;
39.
}
40.
}
41.
printf
(
"%d\n"
,top);
42.
}
43.
return
0;
44.
}