LIS的子问题:dp[i]记录以a[i]为终点的最长上升子序列的长度 dp[1]=1; for(i=2;i<=n;i++) { temp=0; for(j=1;j<i;j++) if(a[i]>a[j]&&dp[j]>temp) temp=dp[j]; dp[i]=temp+1; } LCS的子问题:dp[i][j]记录以i结尾的s1与以j结尾的s2的最长公共子序列的长度 n1=strlen(s1+1); n2=strlen(s2+1); for(i=0;i<=n1;i++) dp[i][0]=0; for(j=0;j<=n2;j++) dp[0][j]=0; for(i=1;i<=n1;i++) for(j=1;j<=n2;j++) if(s1[i]==s2[j]) { dp[i][j]=dp[i-1][j-1]+1; p[i][j]=0; } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j]=dp[i-1][j]; p[i][j]=1; } else { dp[i][j]=dp[i][j-1]; p[i][j]=-1; } printLCS(p,s1,n1,n2); void printLCS(int b[][N],char *x,int i,int j) { if(i==0||j==0) return ; if(b[i][j]==0) { printLCS(b,x,i-1,j-1); printf("%c",x[i]); } else if(b[i][j]==1) printLCS(b,x,i-1,j); else printLCS(b,x,i,j-1); }