Codeforces 954H Path Counting 【DP计数】*
Codeforces 954H Path Counting
题目大意:给你一棵n层的树,第i层的每个节点有a[i]个儿子节点,然后问你树上的简单路径中长度在1~n*2-2之间的每个有多少条
因为直接计算过每个节点的路径并不好算
所以可以算一算从每个节点出发的路径的个数
f[i][j]表示对于在i层的1个节点,向下走行走j步的方案数
g[i][j]表示对于在i层的1个节点,第一步向上行走共走j步的方案数
然后DP式子比较显然
f[i][j]=a[i]∗f[i+1][j−1]
g[i][j]=g[i−1][j−1]+[2≤j]∗f[i][j−2]
然后这样每条路径会在计算的时候被计算两次,所以乘上2的逆元就好了
但是这样会MLE,就很完蛋
然后我们发现g式子DP的时候f只会用到i相等,j比他小的
又因为g的DP式子中是i从小到大来转移的
所以直接在f上进行修改,i从小到大,j从大到小,然后就不会卡空间了
也可以滚动,不过要处理一堆东西,懒得写
#include<bits/stdc++.h>
using namespace std;
#define N 5010
#define Mod 1000000007
#define inv2 500000004
int f[N][N<<];
int n,a[N],s[N];
int ans[N<<]={};
int add(int a,int b){return (a+b)%Mod;}
int mul(int a,int b){return 1ll*a*b%Mod;}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%d",&a[i]);
s[]=;for(int i=;i<=n;i++)s[i]=mul(s[i-],a[i-]);
for(int i=;i<=n;i++)f[i][]=;
for(int i=n-;i>=;i--)
for(int k=;k<=n-;k++){
f[i][k]=mul(a[i],f[i+][k-]);
ans[k]=add(ans[k],mul(s[i],f[i][k]));
}
for(int i=;i<=n;i++)f[][i]=;
for(int i=;i<=n;i++)
for(int k=n*-;k>=;k--){
f[i][k]=f[i-][k-];
if(k>=)f[i][k]=add(f[i][k],mul(a[i-]-,f[i][k-]));
ans[k]=add(ans[k],mul(s[i],f[i][k]));
}
for(int i=;i<=n*-;i++)printf("%d ",mul(ans[i],inv2));
return ;
}
Codeforces 954H Path Counting 【DP计数】*的更多相关文章
- Codeforces 954H Path Counting(DP)
题目链接 Path Counting 题意 给定一棵高度为$n$的树,给出每一层的每个点的儿子个数(某一层的所有点儿子个数相同). 令$f_{k}$为长度为$k$的路径条数,求$f_{1}, ...
- CF 954H Path Counting
H. Path Counting time limit per test 5 seconds memory limit per test 256 megabytes input standard in ...
- Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)
题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...
- counting sort 计数排序
//counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...
- 动态规划(DP计数):HDU 5116 Everlasting L
Matt loves letter L.A point set P is (a, b)-L if and only if there exists x, y satisfying:P = {(x, y ...
- 【POJ1952】逢低吸纳 dp+计数
题目大意:给定一个有 N 个数的序列,求其最长下降子序列的长度,并求出有多少种不同的最长下降子序列.(子序列各项数值相同视为同一种) update at 2019.4.3 题解:求最长下降子序列本身并 ...
- HDU 4055 The King’s Ups and Downs(DP计数)
题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...
- HDU 4055 Number String(DP计数)
题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...
- [Codeforces 1201D]Treasure Hunting(DP)
[Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...
随机推荐
- POJ 2186 Popular Cows(强连通分量Kosaraju)
http://poj.org/problem?id=2186 题意: 一个有向图,求出点的个数(任意点可达). 思路: Kosaraju算法的第一次dfs是后序遍历,而第二次遍历时遍历它的反向图,从标 ...
- spring boot2.1读取 apollo 配置中心3
上篇记录了springboot读取apollo的配置信息,以及如何获取服务端的推送更新配置. 接下来记录一下,如何获取公共namespace的配置. 上文中使用如下代码共聚公共命名空间的配置: @Ap ...
- Grunt Part 2
Objectives and Outcomes In this exercise, you will continue to learn to use Grunt, the task runner. ...
- angular指令中的scope绑定策略
针对独立 scope,可以通过在对象中声明如何从外部传入参数.有以下三种绑定策略: @ - 使用 DOM 属性值单项绑定到指令 scope 中.此时绑定的值总是一个字符串,因为 DOM 的属性值是一个 ...
- 【转】由浅入深探究mysql索引结构原理、性能分析与优化
摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...
- tcp/ip学习笔记-TCP
tcp/ip学习笔记-TCP 彭会锋 报文发送采用的是tcp_output函数,
- 栈之括号匹配问题(java实现)
假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...
- python之数组元素去重
参考:如何消除一个数组里面的重复元素?(面试题目) 思路,即创建一个新数组,把原数组中的元素逐个添加到新数组中(判断新数组中是否已经包含原数组中的元素,如果没有,把原数组中的元素添加到新数组,如果已经 ...
- HDU 5289 尺取
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Putty实现Linux与Windows互传文件
putty远程连接VPS,先开一贴,有空来整理. 从putty官网下载putty,选择[A Windows installer for everything except PuTTYtel]安装包,下 ...