这题上面A 是定序。
不能交叉。
求A.B 的最大匹配。
因为没每个B 有6种选择。
所以把每个b的6个选择倒序排序。然后所有数都排成一列,则转化成了求最长递增子序列问题。
然而 len 和 a 的数组大小弄反了。。。。。wa哭我了快。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <queue>
#include <map>
typedef long long ll;
const int maxn=1e5+10;
using namespace std;
int len[maxn],b[10];
int lis(int a[],int cn){
int top=0,l,r,mid;
len[0]=0;
for(int i=1;i<=cn;++i){
if(a[i]>len[top]) len[++top]=a[i];
else {
l=1;r=top;
while(l<=r){
mid=(l+r)/2;
if(a[i]>len[mid])
l=mid+1;
else
r=mid-1;
}
len[l]=a[i];
}
//for(int j=1;j<=top;++j) printf("%d ",len[j]);puts("~~~");
}
return top;
}
int a[maxn*6];
int main(){
int n,x,cnt;
while(~scanf("%d",&n)){
cnt=0;
for(int i=1;i<=n;++i){
for(int j=0;j<6;++j) {
scanf("%d",&b[j]);
}
sort(b,b+6);
for(int i=5;i>=0;i--)
a[++cnt]=b[i];
}
int ans=lis(a,cnt);
printf("%d\n",ans);
}
return 0;
}