POJ 2004 最长升序子序列

来源:互联网 发布:数据库字段设计规范 编辑:程序博客网 时间:2024/05/17 02:01

比赛中切掉的... 代码很冗余,没怎么仔细想总之,是一个最长升序子序列的题啦。

#include<iostream>#include<string.h>#include<cstdio>#include<algorithm>using namespace std;struct node{    char line[25];    int len;    int count[27];}date[11111];bool cmp( node a,node b ){  if( a.len==b.len ) {     if( strcmp(a.line,b.line)==0 )    return true;  return false; } return a.len<b.len;}int main(){ //freopen( "text.in","r",stdin ); //freopen( "text.out","w",stdout ); int count=0; int pre[11111]; int dp[11111]; memset( date,0,sizeof(date) ); memset( pre,0xFF,sizeof(pre) ); memset( dp,0,sizeof(dp) ); while( scanf( "%s",date[count].line)!=EOF ) {    date[count].len=strlen( date[count].line );    for( int i=0;i<date[count].len;i++ )    date[count].count[date[count].line[i]-'a']++;      dp[count]=1;      count++;  }    sort( date,date+count,cmp );      for( int i=1;i<count;i++ )  {  for( int j=i-1;j>=0;j-- )  {    if( date[i].len==date[j].len+1 )    {     int cnt=0;       for( int k=0;k<26&&cnt<=1;k++ )       if( date[i].count[k]!=date[j].count[k] )          cnt++;  if( cnt==1 )  {     if( dp[i]<dp[j]+1 )     {      dp[i]=dp[j]+1;      pre[i]=j;        }  }  }  if( date[j].len<date[i].len-1 )    break;    }  }int dp_max=0;int index=0;for( int i=0;i<count;i++ ) if( dp[i]>dp_max )  dp_max=dp[i],index=i;    node ans[11111];    int len=0;    for( int i=index;;i=pre[i] )    {  ans[len]=date[i];  len++;  if( pre[i]==-1 )   break;}for( int i=len-1;i>=0;i-- ) printf( "%s\n",ans[i].line ); return 0;}


原创粉丝点击