无情的一题!!!
读了半小时题,才把题目看懂,发现是LIS后写了二分的那种方法,node[i]向ans[i]赋值的时候len++了两次,样例跑不出来,从机房走出去看见一只小猫,回来就发现了bug
=。=
结果一提交,RE,检查发现n最大10000我开的22222,没开小,百度里面看到有人也用这个方法提交后也是RE。。。自己出了几组数据后发现貌似不能用二分写呢(至少我还没想到该怎么改,看到后知道怎么改的筒子请私信=。=)
下面是RE二分代码
#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 10010
using namespace std;
struct Node
{
int x,y;
}node[N];
struct Ans
{
int x,y;
}ans[N];
int len;
int binary_search(int i)
{
int le,ri,mid;
le=1;ri=len;
while(le<=ri)
{
mid=(ri+le)/2;
if(node[i].x<=ans[mid].x&&node[i].y<=ans[mid].y)
ri=mid;
else
le=mid+1;
}
return le;
}
int cmp(Node a,Node b)
{
if(a.x==b.x)
return a.y<=b.y;
else
return a.x<b.x;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%d %d",&node[i].x,&node[i].y);
}
sort(node+1,node+1+n,cmp);
ans[1].x=node[1].x; ans[1].y=node[1].y;
len=1;
for(int i=2;i<=n;i++)
{
if(node[i].x>=ans[len].x&&node[i].y>=ans[len].y)
{
len++;
ans[len].x=node[i].x; ans[len].y=node[i].y;
}
else
{
int pos=binary_search(i);
ans[pos].x=node[i].x;
ans[pos].y=node[i].y;
}
}
cout<<"-----------"<<endl;
for(int i=1;i<=n;i++)
{
printf("%d %d\n",node[i].x,node[i].y);
}
cout<<"------------"<<endl;
for(int i=1;i<=len;i++)
cout<<ans[i].x<<" "<<ans[i].y<<endl;
//printf("%d\n",len);
}
printf("*\n");
return 0;
}
/*
5
1 1
2 6
3 3
4 2
5 5
5
1 1
2 6
4 4
3 8
5 3
*/
其实l和m给的范围蛮小的,只有100,换方法喽
<pre name="code" class="cpp">#include<stdio.h>
#include<string>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 22222
using namespace std;
int dp[110][110];
struct Node
{
int x,y;
}node[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)break;
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&node[i].x,&node[i].y);
dp[node[i].x][node[i].y]++;
}
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
{
dp[i][j]+=max(dp[i][j-1],dp[i-1][j]);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(dp[node[i].x][node[i].y]>ans)
ans=dp[node[i].x][node[i].y];
}
printf("%d\n",ans);
}
printf("*\n");
return 0;
}