神经元(prufer序列+dp)
时间:2019-08-24
本文章向大家介绍神经元(prufer序列+dp),主要包括神经元(prufer序列+dp)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述:
你培育出了一些新型的神经元,它们可以有很多的轴突。
具体来说,对于第i个神经元,它有1~di条轴突,因此可以与1~di个神经元相连,可以将轴突看成无向图的边,假定每个神经元都是不同的。
现在你想知道,有多少种方案使得其中恰好k个神经元相连通,这里的连通需要保证任意两个神经元间有且仅有一条路径,方案数可能很大,你只需要对10^9+7取模输出。
两个方案是不同的当且仅当选择的神经元集合不同或其中有至少一条轴突(u,v)出现在一个方案但不出现在另一个方案。
题解:
首先了解一下prufer序列:https://www.cnblogs.com/zwfymqz/p/8869956.html
由prufer序列的性质我们可以知道:
每个长度为n-2的prufer序列对应一棵n个节点的无根树。
因此,我们可以枚举符合条件的prufer序列个数。
定义 dp[i][j][k] 表示考虑到第i个数,用了j个数,prufer序列长度为k的序列个数,
dp时枚举下一个数选择几次即可。
1 dp[0][0][0]=1; 2 for(int i=0;i<n;i++){ 3 for(int j=0;j<=i;j++){ 4 for(int k=0;k<=n-2;k++){ 5 if(dp[i][j][k]){ 6 dp[i+1][j][k]+=dp[i][j][k];//此数不选 7 dp[i+1][j][k]%=MOD; 8 for(int cnt=0;cnt<=d[i+1]-1&&k+cnt<=n-2;cnt++){//枚举此数选几次 9 dp[i+1][j+1][k+cnt]+=dp[i][j][k]*c[k+cnt][k];//在k+cnt个位置中选k个按顺序放上一序列的数,其余位置放此数 10 dp[i+1][j+1][k+cnt]%=MOD; 11 } 12 } 13 } 14 } 15 }
所以,我们还要预处理一下c[][]数组(c[i][j]表示从i个数中选j个数的方案数),具体求法如下:
1 void init(){ 2 for(int i=0;i<=n;i++){ 3 c[i][0]=1; 4 for(int j=1;j<=i;j++){ 5 c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD;//第i个数可选可不选 6 } 7 } 8 }
完整代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=1e9+7; const int N=105; int n,d[N]; ll c[N][N],dp[N][N][N]; void init(){ for(int i=0;i<=n;i++){ c[i][0]=1; for(int j=1;j<=i;j++){ c[i][j]=(c[i-1][j]+c[i-1][j-1])%MOD; } } } int main(){ scanf("%d",&n); init(); for(int i=1;i<=n;i++){ scanf("%d",&d[i]); } dp[0][0][0]=1; for(int i=0;i<n;i++){ for(int j=0;j<=i;j++){ for(int k=0;k<=n-2;k++){ if(dp[i][j][k]){ dp[i+1][j][k]+=dp[i][j][k]; dp[i+1][j][k]%=MOD; for(int cnt=0;cnt<=d[i+1]-1&&k+cnt<=n-2;cnt++){ dp[i+1][j+1][k+cnt]+=dp[i][j][k]*c[k+cnt][k]; dp[i+1][j+1][k+cnt]%=MOD; } } } } } printf("%d ",n); for(int i=2;i<=n;i++){ printf("%lld ",dp[n][i][i-2]); } return 0; }
原文地址:https://www.cnblogs.com/HarryPotter-fan/p/11405823.html
- Flask快速入门,知识整理
- python的reduce()函数
- 企业级memcached缓存数据库结合php使用与web管理memcached
- python中星号的意义(**字典,*列表或元组)
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
- 还没开始学Python之前,你要知道,Python程序员一定会的十件事
- zabbix-server端与zabbix-agent端部署与监控
- 比特币是什么?比特币从何而来?
- Django内置Admin
- Python内置函数property()使用实例
- 区块链技术的历史发展的不同阶段
- 微信力推搜一搜,培养用户微信搜索习惯,搜一搜直接给红包
- datetime
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下如何查看版本信息的方法步骤
- Android开发实现Files文件读取解析功能示例
- Android实现iPhone晃动撤销输入功能 Android仿微信摇一摇功能
- 猿实战21——商品发布之商品数据存储
- Android编程自定义进度条颜色的方法详解
- Android TextView对齐的两种方法
- Android ScrollView实现反弹效果的实例
- Ubuntu 18.04上安装 phpMyAdmin的详细教程
- Android Popupwindow弹出窗口的简单使用方法
- 解决CentOS7虚拟机无法上网并设置CentOS7虚拟机使用静态IP上网
- Android编程实现自定义Dialog的大小自动控制方法示例
- Linux中如何查看文件的创建时间详解
- Android 图片添加水印的实现方法
- Linux系统清除缓存的方法总结
- 详解Android使用@hide的API的方法