HDU5779 Tower Defence
dp[i][j][k] 已选i个人 选到第j层 第j层有k个人
讨论相邻层 上一层选了l人 那么共有 两层之间的方案数 以及这一层自己的方案数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9+7;
ll Pow[3605];
ll dp[65][65][65];
ll C[65][65];
int N,K;
void debug(){
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= 1; ++j)
for(int k = 1; k <= N; ++k)
printf("dp[%d][%d][%d]=%lld ",i,j,k,dp[i][j][k]);
printf("\n");
}
ll PPow(ll x,int y){
if(x==-1) x += MOD;
ll ans = 1;
while(y){
if(y&1) ans = ans*x% MOD;
y >>= 1; x = x*x %MOD;
}
return ans;
}
int Judge(int x,int y,int z){
int tt = x-z;
if(y == 1) return tt==0;
else if(tt >= y-1) return 1;
else return 0;
}
int main(){
int T;
Pow[0]=1;
C[0][0]=1;
for(int i = 1; i < 65; ++i)
for(int j = 0; j <= i; ++j)
if(j) C[i][j] = (C[i-1][j]+C[i-1][j-1]) % MOD;
else C[i][j] = 1;
for(int i = 1; i < 3605; ++i) Pow[i] = Pow[i-1]*2%MOD;
scanf("%d",&T);
while(T--){
memset(dp,0,sizeof(dp));
scanf("%d %d",&N,&K);
N--;
for(int j = 1; j < K; ++j)
for(int i = 1; i <= N; ++i){
if(j==1) { dp[i][j][i]=C[N][i]*Pow[i*(i-1)/2] % MOD; continue; }
for(int k = 1; k <= i; ++k)
for(int l = 1; l <= i; ++l){
// printf("%lld ",dp[i][j][k]);
if(Judge(i,j,k) && Judge(i-k,j-1,l) ) dp[i][j][k] = (dp[i][j][k] + dp[i-k][j-1][l] * C[N-i+k][k] % MOD
* PPow(Pow[l]-1,k) %MOD * Pow[k*(k-1)/2] %MOD ) % MOD;
// printf("%d %d %d %d: %lld %lld %lld\n",i,j,k,l,dp[i][j][k],C[N-i+k][k],PPow(Pow[l]-1,k) ) ;
}
}
// debug(); ll sum = Pow[N*(N-1)/2];
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= K; ++j)
for(int k = 1; k <= N; ++k){ // if(sum) printf("%d %d %d\n",i,j,k);
sum = (sum + dp[i][j][k]*Pow[(N-i)*(N-i-1)/2]) % MOD;
}
printf("%lld\n",sum);
}
return 0;
}
HDU5779 Tower Defence的更多相关文章
- HDU5779 Tower Defence (BestCoder Round #85 D) 计数dp
分析(官方题解): 一点感想:(这个题是看题解并不是特别会转移,当然写完之后看起来题解说得很清晰,主要是人太弱 这个题是参考faebdc神的代码写的,说句题外话,很荣幸高中和faebdc巨一个省,虽然 ...
- hdu 5779 Tower Defence
题意:考虑由$n$个结点构成的无向图,每条边的长度均为$1$,问有多少种构图方法使得结点$1$与任意其它节点之间的最短距离均不等于$k$(无法到达时距离等于无穷大),输出答案对$1e9+7$取模.$1 ...
- HDU5886 Tower Defence 【两遍树形dp】【最长链预处理】
题意:N个点的一棵带权树.切掉某条边的价值为切后两树直径中的最大值.求各个边切掉后的价值和(共N-1项). 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表 ...
- 动态规划(树形DP):HDU 5886 Tower Defence
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2MAAAERCAIAAAB5Jui9AAAgAElEQVR4nOy9a6wsS3YmFL/cEkh4LP
- HDU 5886 Tower Defence
树的直径. 比赛的时候想着先树$dp$处理子树上的最长链和次长链,然后再从上到下进行一次$dfs$统计答案,和$CCPC$网络赛那个树$dp$一样,肯定是可以写的,但会很烦.......后来写崩了. ...
- HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)
题目链接 2016 Qingdao Online Problem I 题意 在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的 ...
- P2184 贪婪大陆
P2184 贪婪大陆 题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online
吐槽: 群O的不是很舒服 不知道自己应该干嘛 怎样才能在团队中充分发挥自己价值 一点都不想写题 理想中的情况是想题丢给别人写 但明显滞后 一道题拖沓很久 中途出岔子又返回来搞 最放心的是微软微软妹可以 ...
- [luogu P2184] 贪婪大陆 [树状数组][线段树]
题目背景 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败……人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前方是变异了的超级蚂蚁. 小 ...
随机推荐
- UCS业务知识介绍
企业融合网关是集路由.交换.防火墙.VPN.IP PBX等功能于一体的综合性设备,满足企业语音.数据.网络安全等业务需求. UCS融合网关设备则是设备厂商在企业融合网关的基础上进一步提出的融合通信设备 ...
- 使用exe4j工具制作简单的java应用程序
首先需要下载exe4j工具并进行安装,下面是利用exe4j工具制作应用程序的步骤. 1.首先将工程导出为可运行的jar包,选择extract required libralies into gener ...
- 使用Dockerfile构建镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像.它类似shell脚本,由一行行命令组成,支持以#开头的注释行.一般而言,Dockerfile分为四部 ...
- ThinkPHP的使用
在public目录下使用命令行执行:php -S localhost:8888 route.php 无需使用服务器就可启动
- Go语言获取命令行参数
package main import ( "os" "fmt" ) func main() { args := os.Args //获取用户输入的所有参数 { ...
- Math.abs(~2018),掌握规律!
Math.abs(~2018) 这要用到一些计算机的基础知识. Math.abs(x)指的是返回一个数的绝对值,而关键在"~2018",这是取反操作符,故取相反数得结果为-2018 ...
- 测试任务汇总v1.0
2017.08.04 整理了目前我们所在团队需要做的日常任务 定义为v1.0
- js中的回调函数
1.你定义的 2.你没有调用 3.但是最终他执行了 例子: 定时器回调函数 setTimeout(function(){ },100); dom元素的回调函数 document.getElementB ...
- django-高级视图和url配置
高级视图和url配置 一.URLconf技巧 1.流线型化函数导入 对于配置url,我们可以使用以下几种方式: (1)引入view中的函数 from firstSite.view import cur ...
- DAY1--JAVA
学习路线 2017-1-27打卡学习,先学习第一部分Java基础. 面向对象 面向对象---它是从现实世界中客观存在的事物(即对象)出发,并在系统构造中尽可能的运用人类自然的思维方式,来构建软件系统. ...