POJ-2004 简单DP..

     简单的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;   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值