题目链接:
好坑啊。。还有公共串为0时的特殊判断,还有格式错误。。看Discuss看知道除了最后一组测试数据之外都需要空行。。
其余的会LCS打印路径就行了。
法一:
///公共最长上升子序列#include#include #include #include #include #include #define N 505using namespace std;int dp[N][N],flag[N][N];int dp1[N];int a[N],b[N],c[N];int n,m,k;void solve_c(int i,int j){ if(i==0||j==0) return; if(flag[i][j]==0){ solve_c(i-1,j-1); c[++k] = a[i]; }else if(flag[i][j]==1){ solve_c(i-1,j); }else solve_c(i,j-1);}void LCS(){ memset(flag,0,sizeof(flag)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i]==b[j]){ dp[i][j] = dp[i-1][j-1]+1; flag[i][j]=0; }else{ if(dp[i-1][j]>dp[i][j-1]) flag[i][j]=1; else flag[i][j]=-1; dp[i][j] = max(dp[i-1][j],dp[i][j-1]); } } } //printf("%d",dp[n][m]); k = 0; solve_c(n,m); //for(int i=1;i<=k;i++) printf("%d ",c[i]);}void LIS(){ dp1[1] = 1; int mx = 1; for(int i=2;i<=k;i++){ dp1[i]=1; for(int j=1;j c[j]&&dp1[i]
大神模板:
#include#include #include using namespace std;const int maxn = 605;int a[maxn],b[maxn],dp[maxn];int n,m;int LICS(){ int i,j,MAX; memset(dp,0,sizeof(dp)); for(i = 1; i<=n; i++) { MAX = 0; for(j = 1; j<=m; j++) { if(a[i]>b[j] && MAX