您的位置:首页 > 其它

POJ-2004 简单DP..

2012-03-19 10:29 399 查看
简单的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
.s)) 
      {
             a
.l=strlen(a
.s);
             a
.dp=1; 
             for (i=0;i<a
.l;i++)
                 a
.data[a
.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;   
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: