| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
第100次提交竟然不对第100次提交竟然不对,后来发现竟然是快排中的比较部分写错了。
我的思路是先排序,然后计算以第i个元素为结尾的序列的最高高度dp[i]。然后再找最大的dp。
#include <stdio.h>
#include <stdlib.h>
struct block
{
int l,m;
};
void q_sort(struct block*a,int s,int t) //快速排序
{
int i,j;
struct block tmp;
if(s<t)
{
while(1)
{
i = s+1;
j = t;
while(i<=t && (a[i].l<a[s].l || a[i].l==a[s].l && a[i].m<=a[s].m)) //寻找比分解元素大的元素
i++;
while(j>s && (a[j].l>a[s].l || a[j].l==a[s].l && a[j].m>=a[s].m)) //寻找比分解元素小的元素
j--;
if(i<j) //交换
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
else
break;
}
if(j!=s)
{
tmp = a[s];
a[s] = a[j];
a[j] = tmp;
}
q_sort(a,s,j-1);
q_sort(a,j+1,t);
}
}
int main()
{
int n;
int i,j;
int max;
int dp[10000]; //记录最大高度
struct block a[10000];
scanf("%d",&n);
while(n!=0)
{
//read
for(i=0;i<n;i++)
scanf("%d%d",&a[i].l,&a[i].m);
//sort
q_sort(a,0,n-1);
//dp
dp[0] = 1;
for(i=1;i<n;i++)
{
dp[i] = 1;
for(j=i-1;j>=0;j--)
{
if(a[i].m>=a[j].m && dp[i]<dp[j]+1)
{
dp[i] = dp[j] + 1;
}
}
}
//find max
max = dp[0];
for(i=1;i<n;i++)
if(max < dp[i])
max = dp[i];
//print
printf("%d\n",max);
//next data set
scanf("%d",&n);
}
printf("*\n");
return 0;
}
我还有一个思路,就是先给每一个block编号,然后分别按照l和m排序,得到两个编号序列。找着两个编号序列的最大公共子序列。时间复杂度还是O(n^2),可以用滚动数组,空间复杂度还是O(n)。
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator