I.Tower Defense
给你p个重塔,q个轻塔,把这些塔放在n*m的图中,这些塔会相互攻击同行同列的,轻塔不能受到攻击,重塔能承受一个塔的攻击,
问放的方法数。
先假定n < m。
可以先枚举放轻塔的个数为s,显然,方法数为C(n,s) * m * (m-1) * ... * (m-s+1) ,放完之后我们可以发现图其实缩小成为了一个(n-s)*(m-s)的图。
然后放重塔,由于重塔可以承受一个塔的攻击,dp求一下方案,令dp(i,j,k) 表示i*j的图中放k个重塔的方法,通过在图的第一行进行限定条件枚举。
可分为3个小部分:
1.第一行不放重塔 dp(i,j,k) += dp(i-1,j,k)
2.第一行放一个重塔,又分两种情况:
A:同一列不放重塔 dp(i,j,k) += j*dp(i-1,j-1,k-1)
B:同一列放重塔 dp(i,j,k) += j*(i-1)*dp(i-2,j-1,k-2)
3.第一行放两个重塔
dp(i,j,k) += C(j,2)*dp(i-1,j-2,k-2)
求出dp数组之后即总方法数为segma(0,q,i) segma(0,p,j) C(n,i)*m*...*(m-i+1)*dp(n-i,m-i,j)
由于不能不放,所以需要最后减去1.
时间复杂度为K*200^3,K为一常数。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
#include <functional>
#include <stack>
#include <bitset>
using namespace std;
typedef long long ll;
#define INF (0x3f3f3f3f)
#define maxn (1000005)
#define mod 1000000007
#define ull unsigned long long
ll C[][],dp[][][];
void init(){
for(int i = ;i <= ;++i) C[i][] = ;
for(int i = ;i <= ;++i){
for(int j = ;j <= i;++j){
C[i][j] = C[i-][j] + C[i-][j-];
if(C[i][j] >= mod) C[i][j] %= mod;
}
}
for(int i = ;i <= ;++i) for(int j = ;j <= ;++j) dp[i][j][] = ;
for(int i = ;i <= ;++i){
for(int j = ;j <= ;++j){
for(int k = ;k <= ;++k){
//第一行不取
if(i == && j == ){
int t = ;
}
dp[i][j][k] += dp[i-][j][k];
//第一行取一个
dp[i][j][k] += j * dp[i-][j-][k-]%mod;//对应的列不取
if(dp[i][j][k] >= mod) dp[i][j][k] %= mod;
if(i >= && k >= ) dp[i][j][k] += j * (i-) * dp[i-][j-][k-]%mod;//对应的列取
if(dp[i][j][k] >= mod) dp[i][j][k] %= mod;
//第一行取两个
if(j >= && k >= ) dp[i][j][k] += C[j][]*dp[i-][j-][k-]%mod;
if(dp[i][j][k] >= mod) dp[i][j][k] %= mod;
}
}
}
}
ll quickpow(ll x,ll y){
ll ans = ;
while(y){
if(y & ){
ans = ans * x;
if(ans >= mod) ans %= mod;
}
x *= x;
if(x >= mod) x %= mod;
y >>= ;
}
return ans;
}
int main()
{
int T;
int n,m,p,q;
init();
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&n,&m,&p,&q);
if(n > m) swap(n,m);
int li = min(q,n);
ll s = ,ans = ;
for(int i = ;i <= li;++i){
for(int j = ;j <= p;++j){
ans = ans + C[n][i] * s % mod * dp[(n-i)][(m-i)][j] % mod;
if(ans >= mod) ans %= mod;
}
s = s * (m - i);
if(s >= mod) s %= mod;
}
--ans;
if(ans < ) ans += mod;
printf("%lld\n",ans);
}
return ;
}
I.Tower Defense的更多相关文章
- dp --- hdu 4939 : Stupid Tower Defense
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- Stupid Tower Defense
Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...
- 初识Tower Defense Toolkit
Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...
- HDU4939Stupid Tower Defense (有思想的dp)
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- Tower Defense Game
Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...
- hdu 4779 Tower Defense (思维+组合数学)
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- HDU 4779:Tower Defense
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)T ...
- hihoCoder #1199 : Tower Defense Game ——(树型dp)
题目链接:https://hihocoder.com/problemset/problem/1199. 题意:一棵以1为根的树,每个点有一个p值和q值,到这个点需要当前分数大于等于p,然后消耗掉(p- ...
- HDU 4939 Stupid Tower Defense(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939 解题报告:一条长度为n的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...
随机推荐
- OpenCV2:第八章 界面事件
一.简介 OpenCV中提供了程序界面中的鼠标和键盘事件 二.鼠标事件 // 设置鼠标回调函数 void setMouseCallback ( const string& winname, ...
- 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必 ...
- ios之ARC
本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流和讨论.请不要将本文的部分或全部内容用于商用,谢谢合作. 欢迎转载本文,但是转载请注明本文出处:http:/ ...
- bzoj5368 [Pkusc2018]真实排名
题目描述: bz luogu 题解: 组合数计数问题. 首先注意排名指的是成绩不小于他的选手的数量(包括他自己). 考虑怎么增大才能改变排名. 小学生都知道,对于成绩为$x$的人,让他自己不动并让$\ ...
- (4)zabbix监控第一台服务器
2. zabbix监控服务器 创建主机,选择模板以及录入基本信息,过一分钟左右,就可以看到cpu.内存.硬盘等等使用情况.本节以图文为主.by the way, zabbix中文翻译很烂,config ...
- docker系列之file基本操作
dockerfile基础操作 Dockerfile 是记录了镜像是如何被构建出来的配置文件, 可以被 docker 直接执行以创建一个镜像. 它的样子: FROM ubuntu:14.04 MAINT ...
- scrollTop如何实现click后页面过渡滚动到顶部
用JS操作,body元素的scrollTop var getTop = document.getElementById("get-top"); var head = documen ...
- Java面试之基础题---对象Object
参数传递:Java支持两种数据类型:基本数据类型和引用数据类型. 原始数据类型是一个简单的数据结构,它只有一个与之相关的值.引用数据类型是一个复杂的数据结构,它表示一个对象.原始数据类型的变量将该值直 ...
- grunt与requirejs结合使用
// 多个js压缩成一个js // Project configuration. module.exports = function(grunt) { // 使用严格模式 'use strict'; ...
- Exchange 2010 打补丁的顺序
升级的顺序: 客户端访问服务器 ——> 集线器传输服务器 ——>统一消息服务器(如果有的话)——> 邮箱服务器 ——> 边缘服务器.