hunnu 11085 count letter tree 树形DP+背包

原创 2012年03月28日 03:21:51

Counting Letter Tree
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB
Total submit users: 14, Accepted users: 13
Problem 11085 : No special judgement
Problem description
  Letter Tree is a kind of tree whose node is a letter from A to Z. For example , the carton below shows a Letter Tree , node A is the root of tree and it has two children node D and node M (we can also say that parent of both node D and node M is node A). 

What makes it special is that each node of Letter Tree has its Level Value which is between 1 and 5 . The relationship between a letter and its Level Value are showed in following table.
 
Now we raise the problem : Given a Letter Tree , can you count the number of subtree that the sum of Level Value of each node in the subtree exactly equals to 25 ?
Input
  The first line in the input contains a single integer T(1<=T<=10), indicating the number of test cases. 
Each test case begins with a integer N , means the number of node who has one child or more children in the Letter Tree . Then , there will be N strings and each string is in a separate line. The string s[1...Length] means that all nodes s[2],s[3]...s[Length] are children of node s[1].
The input will guarantee that total number of node in a tree is less or equal than 26 and every node is a letter between A and Z. We assume that the root of Letter Tree is always node A ,but the subtree need not meet the assumption.
Output
  For each test , output the answer after the answer MOD 30011 in a separate line.
Sample Input
1
5
ADM
DKLJ
MC
LI
CBH
Sample Output
2

解题报告(from huzijin)

题目意思:有一棵树,每个节点是由一个带有LevelValue(1~5)的字母组成的。求满足条件的子树的棵数,这些子树满足每棵子树的所有节点的LevelValue值之和等于25
题目特别说明不要求子树的根为字母A
解题思路:
dp[root][i][k]表示以root为根的前i个儿子形成的子树的LevelValue之和为k的子树的棵数。
value[i]表示节点iLevelValue值。
递推式:
•dp[i,sonCount_i,c]*dp[root,i-1,k-c]

sonCount_i表示节点i的儿子的个数。
复杂度:
求解一个状态耗时25次操作,一共有26*26*25种状态。
所以综复杂度为26*26*25*25

#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
#include<fstream>
using namespace std;
const int MODE=30011,N=27,SUM=25;
int pre[N],val[N];
vector<int> vec[N];
int dp[N][N];
void dfs(int root)
{
    int len=vec[root].size();
    dp[root][val[root]]=1;
    int i,j,k;
    for(i=0;i<len;++i)
    {
        int child=vec[root][i];
        dfs(child);
        for(k=1;k<=SUM;++k)
            pre[k]=dp[root][k];
        for(k=SUM;k>=0;--k)
            for(j=k;j>=0;--j)
            if(dp[child][j])
                dp[root][k]=(dp[root][k]+pre[k-j]*dp[child][j])%MODE;
    }
}

int main()
{
    int t,i,j,n;
    char str[27];
    for(i=0;i<N;++i)
        val[i]=i%5+1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s",str);
            j=str[0]-'A';
            for(i=1;i<strlen(str);++i)
                vec[j].push_back(str[i]-'A');
        }
        memset(dp,0,sizeof(dp));
        dfs(0);
        int ans=0;
        for(i=0;i<N;++i)
        {
            ans+=dp[i][SUM];
            ans%=MODE;
            vec[i].clear();
        }
        cout<<ans<<endl;
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 2486 Apple Tree(树形DP + 01背包)

/* 树形DP + 01背包 思路:首先bfs将图转变为树,然后dfs进行动态规划。有两种状态,其中d[0][i][j]表示直通,d[1][i][j]表示返回到i节点 ①、②处,曾经出错 临界状态的初...

poj2486 Apple Tree 树形dp背包

题意:由n个结点组成的树,

POJ 2486 Apple Tree 树形DP+分组背包

分组背包思想与树形DP的结合,极为机智的动态规划。

hdu 4929 Another Letter Tree(LCA+DP)

hdu 4929 Another Letter Tree(LCA+DP) 题意:有一棵树n个节点(n 解法:一个很直观的想法,求出lca(设其为w)后,枚举x,求出a到w的路径上,能匹配s...

hdu 4916 Count on the path(树形dp)

题意:给出一颗树,q个询问,每个询问要求回答不在给出的路径上的点的

poj 2486 Apple Tree(树形背包)

题意: 给出一棵树,树上每个节点都有对应数量的苹果,一个人可以从任何点出发,问如何让这个人在走k步以内得到最多的苹果。 题解: 分析发现,这题对于走树的路径是有往回走和不往回走的情况,并且注意到...

【解题报告】uva357_Let Me Count The Ways(让我来数数方案, dp, 完全背包)

357 - Let Me Count The Ways Time limit: 3.000 seconds  Let Me Count The Ways  ...

HDU 5378 Leader in Tree Land(树形背包+组合数学)

题意:把1到n划分到n个结点的树中,子树的领导是这个子树中权值最大的点。求n个结点的树中,领导为k个的情况数。 思路:树形背包。用dp[i][j]表示以i为根的子树中领导为j个的情况数。 首先用siz...

HDU 4044 GeoDefense 树形DP+分组背包

题意: 塔防游戏。 有一棵树,现在敌人在节点1上,其他所有的叶子节点均是你的基地。 现在从节点1放出一个敌人,让你在节点上有策略性放置攻击塔(每个节点都有多种塔型选择,每个节点只能放一个塔),使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)