给你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的更多相关文章

  1. dp --- hdu 4939 : Stupid Tower Defense

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  2. hdu4939 Stupid Tower Defense (DP)

    2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131 ...

  3. Stupid Tower Defense

    Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...

  4. 初识Tower Defense Toolkit

    Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...

  5. HDU4939Stupid Tower Defense (有思想的dp)

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...

  6. Tower Defense Game

    Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...

  7. hdu 4779 Tower Defense (思维+组合数学)

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) ...

  8. HDU 4779:Tower Defense

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

  9. hihoCoder #1199 : Tower Defense Game ——(树型dp)

    题目链接:https://hihocoder.com/problemset/problem/1199. 题意:一棵以1为根的树,每个点有一个p值和q值,到这个点需要当前分数大于等于p,然后消耗掉(p- ...

  10. HDU 4939 Stupid Tower Defense(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939 解题报告:一条长度为n的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...

随机推荐

  1. Codeforces Round #277.5 (Div. 2)-A. SwapSort

    http://codeforces.com/problemset/problem/489/A A. SwapSort time limit per test 1 second memory limit ...

  2. Java中集合类

    一.Collection Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也可以看出,它是List 和 Set ...

  3. HTML5<picture>元素

    HTML5<picture>元素可以设置多张图片 <!DOCTYPE html><html><head><meta http-equiv=&quo ...

  4. 使用Microsoft Hadoop(一)

    To run this program, stage some data in HDFS: 1. create a text file called input.txt that has one in ...

  5. javascript(九)事件冒泡 onmouseenter onmouseenter 默认事件 和 键盘事件

    1 事件冒泡 子元素触发的事件,会往上(父元素)传递: 例子: <div id="box"> <p></p> </div> < ...

  6. 博弈论入门 Bash 、Nim 、Wythoff's Game结论及c++代码实现

    SG函数先不说,给自己总结下三大博弈.和二进制及黄金分割联系密切,数学真奇妙,如果不用考试就更好了. 1.Bash Game:n个物品,最少取1个,最多取m个,先取完者胜. 给对手留下(m+1)的倍数 ...

  7. 下载PhantomJS

    PhantomJS新手?阅读并学习快速入门指南. 视窗 下载phantomjs-2.1.1-windows.zip(17.4 MB)并解压缩(解压缩)内容. 可执行文件phantomjs.exe已准备 ...

  8. rom bist scripts

    rom bist 的input 有rom_content file .校验rom还坏,主要通过signature比较.signature跟rom content file 一一对应的. rom bis ...

  9. LeetCode(137) Single Number II

    题目 Given an array of integers, every element appears three times except for one. Find that single on ...

  10. H.264基本原理与编码流程

    H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用 ...