Codeforces 954H Path Counting


LINK


题目大意:给你一棵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计数】*的更多相关文章

  1. Codeforces 954H Path Counting(DP)

    题目链接  Path Counting 题意  给定一棵高度为$n$的树,给出每一层的每个点的儿子个数(某一层的所有点儿子个数相同).   令$f_{k}$为长度为$k$的路径条数,求$f_{1}, ...

  2. CF 954H Path Counting

    H. Path Counting time limit per test 5 seconds memory limit per test 256 megabytes input standard in ...

  3. Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)

    题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...

  4. counting sort 计数排序

    //counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...

  5. 动态规划(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 ...

  6. 【POJ1952】逢低吸纳 dp+计数

    题目大意:给定一个有 N 个数的序列,求其最长下降子序列的长度,并求出有多少种不同的最长下降子序列.(子序列各项数值相同视为同一种) update at 2019.4.3 题解:求最长下降子序列本身并 ...

  7. HDU 4055 The King’s Ups and Downs(DP计数)

    题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...

  8. HDU 4055 Number String(DP计数)

    题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...

  9. [Codeforces 1201D]Treasure Hunting(DP)

    [Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...

随机推荐

  1. CentOs64位编译安装hadoop-2.6.0

    官方提供的hadoop-2.x版本貌似都是32位的,在64位机子下使用可能会报错,最好使用官方提供的源码进行本地编译,编译成适合本地硬件环境的64位软件包. Hadoop是使用Java语言开发的,但是 ...

  2. Mysql数据库实用语句集

    mysql实用语句 (1).从第0行开始取,取3行(一般用于分页)select * from student limit 0,3 (2).查看当前数据库编码 show variables like ' ...

  3. 用Hibernate框架把hql生成可执行的sql语句-Oracle方言

    引言:为什么这样的需求,源自公司项目需要,公司的项目使用java的struts2+spring2.5+oracle中间件tuxedo,数据库用的是Oracle,但由于不直接连接数据库,用中间件处理的方 ...

  4. Ubuntu16.04 安装openssl

    1 下载 https://www.openssl.org/source/ 2 解压 3 安装 # ./config --prefix=/usr/local --openssldir=/usr/loca ...

  5. Poi中getPhysicalNumberOfCells 与 getLastCellNum的差异

    getPhysicalNumberOfCells 与 getLastCellNum的区别 用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全部读 ...

  6. Python笔试、面试 【必看】

    本文由EarlGrey@编程派独家编译,转载请务必注明作者及出处. 原文:Sheena@codementor 译文:编程派 引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Pyt ...

  7. Kotlin------类和对象(二)

    get/set方法 声明一个属性的完整语法是 var <propertyName>[: <PropertyType>] [= <property_initializer& ...

  8. 2-2-sshd服务安装管理及配置文件理解和安全调优

    大纲: 1. 培养独自解决问题的能力 2. 学习第二阶段Linux服务管理的方法 3. 安装sshd服务 4. sshd服务的使用 5. sshd服务调优 6. 初步介绍sshd配置文件 ###### ...

  9. 1-13 RHEL7-硬盘介绍和磁盘管理

    熟悉Linux平台下的存储介质,LVM逻辑卷.RAID 磁盘陈列等 大纲: 1-1  硬盘的分类及使用fdisk分区工具       1-1-1 认识硬盘的分类和特性.SCSI.IDE.SAS.SAT ...

  10. Lua学习笔记2. lua变量和 循环

    1. lua中变量的作用域有三种:全局,局部,表中的域 需要注意的是默认的变量都是全局变量,必须声明为local的变量才是局部变量,即使是在函数里面没有使用local修饰的变量依然是全局变量!!!! ...