简单的DP...并且在转移的时候标记转移的路径~~最后再输出最优路径就ok了...
Program:
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> #define PI 3.1415927 using namespace std; struct node { int l,dp,pre,data[26]; char s[22]; }a[10002]; bool cmp(node a,node b) { return a.l<b.l; } int i,j,k,n,ans,w[22]; char out[10002][22]; int main() { n=1; memset(a,0,sizeof(a)); while (~scanf("%s",a[n].s)) { a[n].l=strlen(a[n].s); a[n].dp=1; for (i=0;i<a[n].l;i++) a[n].data[a[n].s[i]-'a']++; n++; } n--; sort(a+1,a+1+n,cmp); memset(w,0,sizeof(w)); for (i=2;i<=n;i++) if (a[i].l!=a[i-1].l) w[a[i-1].l]=i-1; ans=1; for (i=1;i<=n;i++) if (w[a[i].l-1]) { for (j=w[a[i].l-1];a[j].l==a[i].l-1;j--) { for (k=0;k<26;k++) if (a[i].data[k]<a[j].data[k]) goto A; if (a[i].dp<a[j].dp+1) { a[i].dp=a[j].dp+1; a[i].pre=j; } A: ; } if (a[i].dp>a[ans].dp) ans=i; } n=0; i=ans; j=0; while (i) { strcpy(out[++j],a[i].s); i=a[i].pre; n++; } for (i=n;i>=1;i--) puts(out[i]); return 0; }