求最长上升子序列的长度以及个数,由于数据水,可以直接找 正解是DP+网络流
#include "cstring"
#include "iostream"
#include "algorithm"
#include "cstdio"
#include "queue"
#include "set"
using namespace std;
typedef long long LL;
const int M=100050;
const int INF = 0x3f3f3f3f;
int a[M],b[M];
int vis[M];
int ans,cnt;
int search(int num,int low,int high)
{
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(num>b[mid])
low=mid+1;
else
high=mid-1;
}
return low;
}
int DP(int n)
{
int i,len,pos;
len=0;
for(int i=1; i<=n; ++i)
{
if(vis[i])
{
continue;
}
pos=search(a[i],1,len);
b[pos]=a[i];
if(pos>len)
{
len++;
vis[i]=1;
}
//vis[i]=1;
}
return len;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=1; i<=n; ++i)
{
cin>>a[i];
}
ans=0,cnt=1;
int m=n;
// memset(b,0,sizeof(b));
memset(vis,0,sizeof(vis));
while(m--)
{
memset(b,0,sizeof(b));
int temp=DP(n);
if(temp>ans)
{
ans=temp;
cnt=1;
}
else if(temp==ans)
{
cnt++;
}
else if(temp<ans)
break;
}
cout<<ans<<"\n"<<cnt<<endl;
}
return 0;
}