51 nod 1006 最长公共子序列Lcs
#include <iostream> #include <cstring> using namespace std; int dp[1005][1005]; int vis[1005][1005]; string a,b; void print(int len1,int len2) { if(vis[len1][len2]==0){ if(dp[len1][len2]==0) return; print(len1-1,len2-1); // cout<<len1-1<<endl; cout<<a[len1-1]; } else if(vis[len1][len2]==1){ print(len1-1,len2); } else if(vis[len1][len2]==-1){ print(len1,len2-1); } // if(dp[len1][len2]==0) return; } int main() { string s; cin>>a>>b; memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); int length1=a.length(); int length2=b.length(); for(int i=1;i<=length1;i++){ for(int j=1;j<=length2;j++){ if(a[i-1]==b[j-1]){ dp[i][j]=dp[i-1][j-1]+1; vis[i][j]=0; } else if(dp[i-1][j]>dp[i][j-1]){ dp[i][j]=dp[i-1][j]; vis[i][j]=1; } else{ dp[i][j]=dp[i][j-1]; vis[i][j]=-1; } } } // for(int i=1;i<=length1;i++){ // for(int j=1;j<=length2;j++){ // cout<<dp[i][j]<<" "; // } // cout<<endl; // } print(length1,length2); return 0; }
用vis标记走过的路径,用递归的方式输出最优方案。