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. 02_zookeeper集群安装

    zookeeper集群安装 (1)   下载zookeeper安装包,并上传到要组成zookeeper集群的多个机器上 我放置的目录:/usr/local/src/zookeeper-3.4.5.ta ...

  2. select * from table_name where 1=1的

    我们先来看看这个语句的结果:select * from table where 1=1,其中where 1=1,由于1=1永远是成立的,返回TRUE,条件为真:所以,这条语句,就相当于select * ...

  3. brew 与 nvm

    brew  与 nvm 是两个管理软件工具 今天更新了brew结果brew下安装的软件都找不着了.得重新安装,据说brew已经不再更新了.应该是通过github的吧. 结果得重装node与npm,这两 ...

  4. [Vue]实例化Vue时的两种挂载方式el与$mount

    Vue 的$mount()为手动挂载,在项目中可用于延时挂载(例如在挂载之前要进行一些其他操作.判断等),之后要手动挂载上.new Vue时,el和$mount并没有本质上的不同. 1.el Vue实 ...

  5. Java新建线程的3种方法

    Java新建线程的3种方法 =================== Java创建线程有3种方法:(1)继承Thread;(2)实现Runnable接口:(3)实现Callable接口; 由于Java只 ...

  6. flask学习(九):模板渲染和参数传递

    一. 如何渲染模板 1. 模板放在templates文件夹下 2. 从flask中导入render_template函数 3. 在视图函数中,使用render_template函数,渲染模板 注意:只 ...

  7. C#/Java 程序员转GO/golang程序员笔记大全(day 01)

    前言: 整理一下学习 Go 语言的笔记,作为一名老程序,学习一名新的开发语言自然不需要像小白那样从 HelloWorld 看起. 简单整理一下 Go 的一些差异处,希望对大家学习 go 有点帮助,不正 ...

  8. Python3 学习第十三弹: 模块学习五之pickle与json

    对于python来说,这两个模块是十分实用的两个模块,以一种简单的方法用于储存数据实例. pickle模块 提供用来储存Python各种数据序列化存储 # 原来的cPickle已经在python3中与 ...

  9. IOS-网络(网页开发-UIWebView,HTML,CSS,JavaScript,OC和JS代码互调)

    一.网页基础 // // ViewController.m // IOS_0218_网页开发1 // // Created by ma c on 16/2/18. // Copyright © 201 ...

  10. 013PHP基础知识——流程控制(一)

    <?php /** * 13 流程控制(一) * if语句: if(表达式){ 表达式 }elseif(表达式){ 代码段 } * if语句中,一个条件成立,其他分支不执行. * if中的表达式 ...