子序列(LIS、LCS)

来源:互联网 发布:旅游点评网站源码 编辑:程序博客网 时间:2024/06/10 22:22

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;        }    } 


0 0
原创粉丝点击