开始没想出什么思路,看了题解恍然大悟,是LIS,不过一看数据量O(n*n)的复杂度要到十的八次方,就一直在思考nlgn,也就是加上二分的方法应该怎么做。可是思来想去觉得难以实现,后来才发现数据比较水,直接N的平方几十毫秒就过了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAX 105
using namespace std;
int l[MAX*MAX],amount[MAX*MAX],f[MAX*MAX],flag,r,c,n;
struct node{
int x,y;
bool operator<(node other)const{
if(x<other.x)
return 1;
else if(x==other.x&&y<=other.y){
return 1;
}
return 0;
}
}s[MAX*MAX];
void print(int index){
if(index==-1)
return ;
print(f[index]);
if(flag&&index==n-1)
return ;
printf(" %d",(s[index].x-1)*c+s[index].y);
}
int main(){
int a,b,cases=1;
while(~scanf("%d %d",&r,&c)&&r!=-1){
n=flag=0;
memset(s,0,sizeof(s));
while(scanf("%d %d",&a,&b)&&a!=0){
s[n].x=a,s[n++].y=b;
}
sort(s,s+n);
if(!(s[n-1].x==r&&s[n-1].y==c))
s[n].x=r,s[n++].y=c,flag=1;
for(int i=0;i<n;i++){
l[i]=1,amount[i]=1,f[i]=-1;
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(s[j].y<=s[i].y){
if(l[j]>=l[i]){
l[i]=l[j]+1,amount[i]=amount[j];
f[i]=j;
}
else if(l[j]+1==l[i])
amount[i]+=amount[j];
}
}
}
printf("CASE#%d: ",cases++);
if(flag)
printf("%d",l[n-1]-1);
else
printf("%d",l[n-1]);
printf(" %d",amount[n-1]);
print(n-1);
puts("");
}
return 0;
}