LIS
int lis(int n)
{
memset(dp,0,sizeof(dp));
int ans=0;
for (int i=0;i<n;i++)
{
for (int j=0;j<i;j++)
if(b[j]<=b[i]) dp[i]=max(dp[i],dp[j]+1);
ans=max(ans,dp[i]);
}
return ans;
}
int a[N],dp[N];
int n;//1-n
int bin(int size,int k)
{
int l=1,r=size;
while(l<=r)
{
int mid =(l+r)/2;
if(k>dp[mid]) l = mid+1;
else r = mid-1;
}
return l;
}
int lis()
{
int i,j,cnt=0,k;
for(i=1;i<=n; i++)
{
if(cnt==0||a[i]>dp[cnt]) dp[++cnt] = a[i];
else
{
k = bin(cnt,a[i]);
dp[k]=a[i];
}
}
return cnt;
}
int lis()
{
int len=0;
for(int i=0;i<n;i++)
{
int k=lower_bound(f,f+len,a[i])-f;//upper_bound();
f[k]=a[i];
if(k==len) len++;
}
return len;
}
LCS
int lcs()
{
int ii=strlen(a);
int jj=strlen(b);
memset(f,0,sizeof f);
for(i=1;i<=ii;i++)
for(j=1;j<=jj;j++)
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
return dp[ii][jj];
}
int lcs(int n,int m)
{
memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++)
for(int j=0,ans=0;j<n;j++)
{
int tmp=dp[j];
if(s1[i]==s2[j]) dp[j]=ans+1;
else dp[j]=max(dp[j],dp[j-1]);
ans=tmp;
}
}