hdu5282 最长公共子序列

来源:互联网 发布:java 图片添加文字 编辑:程序博客网 时间:2024/06/06 05:10

这道题不错,怎么说呢,又是一到让我涨姿势的题(因为不会做尴尬

#include <string.h>  #include <stdio.h>  #include <iostream>  #include <stdlib.h>  #include <memory.h>  #include <cmath>  #include <algorithm>    using namespace std;      #define ll long long    const int mod = 1e9+7;    char a[1010];  char b[1010];    int dp[1010][1010];  int ans[1010][1010];    int last[200];    int main(){      int t;      cin>>t;      while(t--){          memset(dp,0,sizeof(dp));          memset(ans,0,sizeof(ans));          memset(last,0,sizeof(last));                    scanf("%s%s",a+1,b+1);          int lena=strlen(a+1);          int lenb=strlen(b+1);                    for(int i=0;i<=max(lena,lenb);i++){              ans[i][0]=1;              ans[0][i]=1;          }                    for(int i=1;i<=lena;i++){              for(int j=1;j<=lenb;j++){                  if(a[i]==b[j]){                      dp[i][j]=dp[i-1][j-1]+1;                  }                  dp[i][j]=max(dp[i][j],dp[i-1][j]);                  dp[i][j]=max(dp[i][j],dp[i][j-1]);              }          }                    for(int i=1;i<=lena;i++){              memset(last,0,sizeof(last));              for(int j=1;j<=lenb;j++){                  if(dp[i-1][j]==dp[i][j]){                      ans[i][j]=ans[i-1][j];                  }                  last[b[j]]=j;                  int pos=last[a[i]];                  if(pos && dp[i-1][pos-1]+1==dp[i][j]){                      ans[i][j]+=ans[i-1][pos-1];                  }                  ans[i][j]%=mod;              }          }          cout<<ans[lena][lenb]<<endl;      }      return 0;  } 


0 0
原创粉丝点击