codeforces431C - k-Tree DP

题意:给你一个K叉数,每个节点都一定有K 个子节点,且到这K个子节点的费用为1-k,问你 费用总和为n且最少需要走过一条 d-k的边的概率

解题思路:分成两个二维DP,一个表示没有走过的,一个表示走过的,即可dp求出

解题代码:

 1 /************************************************************
 2  * Author : darkdream
 3  * Email : [email protected]
 4  * Last modified : 2014-08-02 14:28
 5  * Filename : 431c.cpp
 6  * Description :
 7  * *********************************************************/
 8 // File Name: 431c.cpp
 9 // Author: darkdream
10 // Created Time: 2014年08月01日 星期五 20时22分33秒
11
12 #include<vector>
13 #include<list>
14 #include<map>
15 #include<set>
16 #include<deque>
17 #include<stack>
18 #include<bitset>
19 #include<algorithm>
20 #include<functional>
21 #include<numeric>
22 #include<utility>
23 #include<sstream>
24 #include<iostream>
25 #include<iomanip>
26 #include<cstdio>
27 #include<cmath>
28 #include<cstdlib>
29 #include<cstring>
30 #include<ctime>
31
32 #define LL long long
33 using namespace std;
34 LL dp[104][104];
35 LL dpa[104][104];
36 #define md 1000000007
37 int main(){
38     int n , k , d;
39     scanf("%d %d %d",&n,&k,&d);
40     memset(dp,0,sizeof(dp));
41     memset(dpa,0,sizeof(dpa));
42     dp[0][0] = 1;
43     LL ans = 0 ;
44     for(int i = 1;i <= n;i ++)
45     {
46         for(int j = i-1;j <= n;j ++)
47         {
48            if(dp[i-1][j])
49            {
50               for(int s = 1;s <= k ; s ++)
51               {
52                  if(j + s > n)
53                      break;
54                  if(s <  d )
55                      dp[i][j+s] = (dp[i][j+s] + dp[i-1][j]) % md;
56                  else
57                      dpa[i][j+s] = (dpa[i][j+s] + dp[i-1][j]) % md;
58               }
59            }
60            if(dpa[i-1][j])
61            {
62               for(int s = 1; s <= k; s++)
63               {
64                  if(j + s > n)
65                      break;
66                  dpa[i][j+s] = (dpa[i-1][j]+ dpa[i][j+s]) %md;
67               }
68            }
69         }
70     }
71     for(int i = 1;i <= n;i ++)
72         ans =( dpa[i][n]+ ans)%md;
73     printf("%I64d\n",ans%md);
74 return 0;
75 }

codeforces431C - k-Tree DP

时间: 2024-08-07 16:46:08

codeforces431C - k-Tree DP的相关文章

HDU 4359 Easy Tree DP?

Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1487    Accepted Submission(s): 567 Problem Description A Bear tree is a binary tree with such properties : each node has a value o

hdu5534 Partial Tree dp(难)

hdu5534 Partial Tree  dp(难) Partial Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 374    Accepted Submission(s): 209 Problem Description In mathematics, and more specifically in graph t

HDU 4359——Easy Tree DP?——————【dp+组合计数】

Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1460    Accepted Submission(s): 557 Problem Description A Bear tree is a binary tree with such properties : each node has a value o

DP Intro - Tree DP Examples

因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树,让你求最少剪掉多少条边可以剪出一棵点数为m的子树. 解法:dp[i][j]表示i节点得到j个节点的子树至少要剪多少边,对于每个节点a和它的孩子b,如果剪掉b,则dp(s)[a][j]=dp(s-1)[a][j], 如果保留<a,b>dp(s)[a][j]=min{dp(s-1)[a][j - k

TYOI Day1 travel:Tree dp【处理重复走边】

题意: 给你一棵树,n个节点,每条边有长度. 然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值. 题解: 对于无根树上的dp,一般都是先转成以1为根的有根树,然后分别从上到下和从下到上两遍dp. 另一个技巧是:处理重复走边的情况时,可以让dp值表示达到某种状态的方案数. 表示状态: dp[i][j][k] = max dis 表示从i节点出发,走的距离mod k = j时的方案数 找出答案: 对于每次询问(u,k),答案为:满足dp[u][d][k]>0的最

bzoj 1017 tree dp

这道题几经波折啊. 最开始和vfleaking一样,把题意理解错了,认为一个装备可能被多个装备依赖,然后想不出来,去看题解. 发现自己理解错了题意,自己想想,其实也不难想到dp[i][j][k]表示“i号节点代表的子树,用掉j的钱,给父亲预留k个自己(但还是父亲付钱)”的状态,写出来交上去就是T, 开始以为是常数问题,优化半天还是T,看了他人AC代码,才发现自己算法有一定问题:重复计算了很多东西. 树形动规,一般在大的树规下,每个节点还会对儿子们来一次”资源分配“,一般是用背包解决,这道题也是这

codeforces 514E Darth Vader and Tree (dp+快速幂)

codeforces 514E Darth Vader and Tree (dp+快速幂) 题意: 有一棵树,每个节点有n个儿子,给出父亲到每个儿子的距离di,问离祖先距离不超过x的子孙有多少个(子孙包括祖先)对1e9+7取模. 限制: 1 <= n <= 1e5; 0 <= x <= 1e9; 1 <= di <= 100 思路: 因为di <= 100,所以可以用快速幂来处理这道题, 大概过程为:先用dp算出前100的答案,剩下的用快速幂来处理.

hdu 4050 2011北京赛区网络赛K 概率dp ***

题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到达这个格子 1:表示左脚跳进这个格子 2:表示右脚跳进这个格子 3:随意哪个脚跳进这个格子,而且下一步随意用哪个脚 dp[i][j] :表示走到第 i 个格子在 j 状态的期望. 当j=1时,你可以走到dp[i+k][2],dp[i+k][3], 当j=2时,你可以走到dp[i+k][1],dp[i

hdu4359 Easy Tree DP? dp

题意: 给定n deep 1.构造一个n个节点的带权树,且最大深度为deep,每个节点最多只能有2个儿子 2.每个节点的值为2^0, 2^1 ··· 2^(n-1)  任意两个节点值不能相同 3.对于一个节点,若他有左右儿子,则左子树的和 < 右子树的和,不然不限制. 思路:设dp[ i ] [ j ]为结点数为i,深度不超过 j 的满足条件的树的个数.首先考虑invlid情况,即: dp[ i ] [ j ] += 2×C[i] [i-1]×dp[ i - 1] [ j -1].乘2是因为要么

HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1798    Accepted Submission(s): 585 Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,-,n.The