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; }
浙公网安备 33010602011771号