[bfs树 分层图][DP] hihocoder Pro.1147 时空阵
来源:互联网 发布:钢铁侠中的人工智能 编辑:程序博客网 时间:2024/05/19 19:58
题目传送门
因为是Manchery讲的bfs树的题目,那么就考虑bfs树
因为bfs树不存在返祖边,所以bfs树上的点的深度就是根节点到它的最短路,那么就一层一层DP。
令
考虑转移
先选点
- 当
i<k 时, 方案是(n−j+s−1s) (DP到这一层剩下n−j+s 个 点,但是n 节点不能在小于k 层选,所以能选的节点有n−j+s−1 个)。 - 当
i=k 层,n 节点就必须要选,所以方案数是(n−j+s−1s−1)
- 当
选的这
s 个点要与上一层的w 个点连边,且这s 个点都至少要连出一条边,这样总连边的方案数是(2w−1)s 。- 这些点直接相互可以连边,总方案数是
2s×(s−1)2
所以转移是
i<k→fi,j,s=fi−1,j−s,w×(n−j+s−1s)×(2w−1)s×2s×(s−1)2 i=k→fi,j,s=fi−1,j−s,w×(n−j+s−1s−1)×(2w−1)s×2s×(s−1)2
这样就好啦
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=110,P=1e9+7;int n,k,f[N][N][N];int fac[N],inv[N];inline int Pow(int x,int y){ int ret=1; for(;y;y>>=1,x=1LL*x*x%P) if(y&1) ret=1LL*ret*x%P; return ret;}inline int C(int x,int y){ return 1LL*fac[x]*inv[y]%P*inv[x-y]%P;}inline void add(int &x,int y){ if((x+=y)>=P) x-=P;}int main(){ freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d%d",&n,&k); fac[0]=inv[0]=inv[1]=1; for(int i=1;i<=n;i++) fac[i]=1LL*fac[i-1]*i%P;; for(int i=2;i<=n;i++) inv[i]=1LL*(P-P/i)*inv[P%i]%P; for(int i=1;i<=n;i++) inv[i]=1LL*inv[i]*inv[i-1]%P; f[0][1][1]=1; for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) for(int s=1;s<=j;s++) for(int w=1;w<=j-s;w++) if(i<k) add(f[i][j][s],1LL*f[i-1][j-s][w]*C(n-j+s-1,s)%P*Pow(Pow(2,w)-1,s)%P*Pow(2,s*(s-1)/2)%P); else add(f[i][j][s],1LL*f[i-1][j-s][w]*C(n-j+s-1,s-1)%P*Pow(Pow(2,w)-1,s)%P*Pow(2,s*(s-1)/2)%P); int ans=0; for(int i=k+1;i<=n;i++) for(int j=1;j<=n;j++) add(ans,1LL*f[k][i][j]*Pow(2,(n-i)*(n-i-1)/2+j*(n-i))%P); printf("%d\n",ans); return 0;}
阅读全文
0 0
- [bfs树 分层图][DP] hihocoder Pro.1147 时空阵
- [分层图 DP] HihoCoder #1147 时空阵
- hihoCoder 1147 时空阵
- hihoCoder 1147 时空阵(动态规划)
- HihoCoder 1251 BFS预处理
- HihoCoder 1233 Boxes BFS
- hihocoder #1500 : EL SUENO 树DP
- 【网络流24题】孤岛营救问题(分层图+BFS)
- hihoCoder 1233 Boxes(bfs)
- 【hihocoder】状态压缩dp
- 【DP】 hihocoder #1159 : 扑克牌
- 【DP】 hihocoder #1170 : 机器人
- hihocoder 1243 树形DP
- hihocoder 1259 (数位DP)
- hihocoder 1290 DP
- hihocoder 1044 (状压dp)
- 数字三角形--hihocoder(DP)
- hihocoder 1469 福字 (dp)
- go学习(二)——基本数据类型和基本语法
- POJ-1995-Raising Modulo Numbers
- 用C语言实现 C到C++的注释转换
- 免费软件真的免费吗?
- go学习(三)——gdb调试
- [bfs树 分层图][DP] hihocoder Pro.1147 时空阵
- 利用BFS和DFS解决 LeetCode 130: Surrounded Regions
- 设置按钮和菜单快捷键
- helloworld
- 算法面试题之字符串子串
- go学习(四)——调用C库
- 出栈序列的统计
- 拥塞控制算法测试——Planetlab平台实验
- 8.2常用类(Object类,Scanner类)