首页 > 代码库 > poj2250 最长上升子序列 + 输出
poj2250 最长上升子序列 + 输出
1 //Accepted 208 KB 0 ms 2 //最长公共上升子序列+输出 3 //dp 4 //输出时用的递归输出,注意条件判断 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 using namespace std; 9 const int imax_n = 105;10 const int imax_stringlen = 32;11 char s1[imax_n][imax_stringlen];12 char s2[imax_n][imax_stringlen];13 int dp[imax_n][imax_n];14 int n1,n2;15 int max(int a,int b)16 {17 return a>b?a:b;18 }19 void Dp()20 {21 memset(dp,0,sizeof(dp));22 for (int i=1;i<=n1;i++)23 {24 for (int j=1;j<=n2;j++)25 {26 dp[i][j]=max(dp[i-1][j],dp[i][j-1]);27 if (strcmp(s1[i],s2[j])==0)28 dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);29 }30 }31 }32 void output(int i,int j)33 {34 if (dp[i][j]==0) return ;35 if (dp[i-1][j]==dp[i][j])36 {37 output(i-1,j);38 return ;39 }40 if (dp[i][j-1]==dp[i][j])41 {42 output(i,j-1);43 return ;44 }45 if (dp[i-1][j-1]+1==dp[i][j])46 {47 output(i-1,j-1);48 if (dp[i][j]==1)49 {50 printf("%s",s1[i]);51 return ;52 }53 else54 {55 printf(" %s",s1[i]);56 return ;57 }58 }59 return ;60 }61 int main()62 {63 while (scanf("%s",s1[1])!=EOF)64 {65 int k=1;66 k++;67 while (scanf("%s",s1[k]) && s1[k][0]!=‘#‘)68 k++;69 n1=k-1;70 k=1;71 while (scanf("%s",s2[k]) && s2[k][0]!=‘#‘)72 k++;73 n2=k-1;74 Dp();75 output(n1,n2);76 printf("\n");77 }78 return 0;79 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。