PKU POJ 2414 Phylogenetic Trees Inherited DP

英语水平有限,题目意思看了下面博客才懂

http://www.cnblogs.com/Lyush/archive/2013/01/11/2857012.html

意思是:给定N个字符串,N为2的幂,每个字符串长度为L,这N个字符串 是一棵完全二叉树的叶子节点,现在问树的内部在同样要填入长度为L的字符串的情况下,最少的花费是多少,根节点是什么。
用DP从叶子节点向根节点计算,dp数组从根1开始,dp[i][j]是某个叶子节点的第j个字母的所有可能取值。用32位整数最后26位代表是否取某个字母。
#include<iostream>
#include <string.h>
#include <string>
using namespace std;
int dp[2050][1005];
int main()
{
    int cnt,n,l,i,j;
    char s[1005];
    while (scanf("%d%d",&n,&l)!=EOF&&(n||l))
    {
        for (i=n;i<2*n;++i)
        {
            scanf("%s",s);
            for (j=0;j<l;++j)
                dp[i][j]=1<<(s[j]-'A');
        }
        cnt=0;
        for (i=n-1;i>0;--i)
        {
            for(j=0;j<l;++j)
            {
                if(dp[i<<1][j]&dp[(i<<1)+1][j])
                    dp[i][j]=dp[i<<1][j]&dp[(i<<1)+1][j];
                else
                {
                    cnt++;
                    dp[i][j]=dp[i<<1][j]|dp[(i<<1)+1][j];
                }
            }
        }
        for (j=0;j<l;++j)
        {
            i=0;
            while (!(dp[1][j]&1))
            {
                i++;
                dp[1][j]>>=1;
            }
            printf("%c",i+'A');
        }
        printf(" %d\n",cnt);
    }
    return 0;
}

 

posted on 2013-03-04 18:15  Deller  阅读(184)  评论(0)    收藏  举报

导航