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的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...
随机推荐
- tomcat BIO 、NIO 、AIO
11.11活动当天,服务器负载过大,导致部分页面出现了不可访问的状态.那后来主管就要求调优了,下面是tomcat bio.nio.apr模式以及后来自己测试的一些性能结果. 原理方面的资料都是从网上找 ...
- JDBC连接数据库详解
JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.la ...
- PHP 递归无限极下级
下面是自己用到的一些递归方法,当然都是借鉴的,各位看官请勿怪 第一种 有层级 $array = array( array('id' => 1, 'pid' => 0, 'n' => ...
- Flask——基础知识
Flask应用程序 一个简单的Flask应用程序 # 导入flask程序 from flask import Flask # 初始化flask对象 app = Flask(__name__) # 装饰 ...
- shell脚本,awk常见初始化变量的题目。
文件 内容如下 clone=line1gb=line1gi=line1lib=line1gb=line2gi=line2lib=line2clone=line3gb=line3gi=line3lib= ...
- noip_最后一遍_3-数据结构
noip基础数据结构太多了又太捞了 所以也就那么几个了 单调队列滑动窗口 #include<bits/stdc++.h> using namespace std; #define maxn ...
- Android Studio问题记录
1>Android Studio中module是什么,? 答:Android Studio是基于intellij,跟eclipse不太一样.对应关系如下: intellij的project -- ...
- python面向对象(反射)(四)
1. isinstance, type, issubclass isinstance: 判断你给对象是否是xx类型的. (向上判断 type: 返回xxx对象的数据类型 issubclass: 判断x ...
- Cocos2D 添加 UIView
cocos2d是使用继承于ccnode的结点类型的层.但是我想用一个opengl来绘制,就简单的情况来说必须得加一个uiview.现转载如下: 第一部分:: 使用Cocos2D开发游戏和应用程序的时候 ...
- linux 下常见命令
===============安装和登陆命令============================================================= Mount: 挂载命令.把存储介 ...