题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806

看到这题首先会想到状压什么乱七八糟的,然而很难做;

其实,因为求的是方案数,所以并不需要关注炮摆放的位置,而只需要关注数量;

f[i][j][k] 表示第 i 行及以前共有 j 个有 0 炮的列和 k 个有 1 炮的列,就可以转移了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const mod=,maxn=;
ll n,m,f[maxn][maxn][maxn],ans;
ll C(ll x){return ((x-)*x/)%mod;}//不是(x+1) !!
int main()
{
scanf("%d%d",&n,&m);
f[][m][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)//
for(int k=;k<=m-j;k++)//
{
(f[i][j][k]+=f[i-][j][k])%=mod;//放0个
if(k>=&&j<m)(f[i][j][k]+=f[i-][j+][k-]*(j+))%=mod;//0 -> 1 //别写成 if(k&&j<m) !!
if(k<m)(f[i][j][k]+=f[i-][j][k+]*(k+))%=mod;//1 -> 2
if(j<m)(f[i][j][k]+=f[i-][j+][k]*(j+)*k)%=mod;//0 1 -> 1 2
if(k->=&&j+<=m)(f[i][j][k]+=f[i-][j+][k-]*C(j+))%=mod;//0 0 -> 1 1
if(k+<=m)(f[i][j][k]+=f[i-][j][k+]*C(k+))%=mod;//1 1 -> 2 2
}
for(int j=;j<=m;j++)
for(int k=;k<=m;k++)
(ans+=f[n][j][k])%=mod;
printf("%lld",ans);
return ;
}

bzoj4806 炮——DP的更多相关文章

  1. BZOJ4806(SummerTrainingDay03-K dp)

    炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 464  Solved: 243[Submit][Status][Discuss] Descript ...

  2. bzoj4806 炮

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 这种题应该想状压的. 于是发现压不下,结合每一行每一列最多放两个炮想到记一下放炮的列就 ...

  3. 【bzoj4806~bzoj4808】炮车马后——象棋四连击

    bzoj4806——炮 题目传送门:bzoj4806 这种题一看就是dp...我们可以设$ f[i][j][k] $表示处理到第$ i $行,有$ j $列没放炮,$ k $列只放了一个炮.接着分情况 ...

  4. 炮(棋盘DP)

    一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...

  5. 2018.07.22哨戒炮 II(树形dp)

    哨戒炮 II 描述 你的防线成功升级,从原来的一根线变成了一棵树.这棵树有 N 个炮台,炮台与炮台之间 有 N-1 条隧道.你要选择一些炮台安装哨戒炮.在第 i 个炮台上安装哨戒炮得到的防御力为 vi ...

  6. Bzoj 4806 炮 (dp)

    题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子".  炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...

  7. Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP

    传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...

  8. [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)

    大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...

  9. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)

    注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...

随机推荐

  1. 查看java进程中哪个线程在消耗系统资源

    1 top -p $pid -H  加上-H这个参数后,会列出有哪些线程.这样就可以看到哪个线程id最消耗系统资源了.看到的线程id是10进制的数字. 2 jstack $pid 可以打印出制定jav ...

  2. POJ 2391 Ombrophobic Bovines【二分 网络流】

    题目大意:F个草场,P条道路(无向),每个草场初始有几头牛,还有庇护所,庇护所有个容量,每条道路走完都有时间,问所有奶牛都到庇护所最大时间最小是多少? 思路:和POJ2112一样的思路,二分以后构建网 ...

  3. react.js 渲染一个列表的实例

    //引入模块 import React,{Component} from 'react'; import ReactDOM from 'react-dom'; //定义一个要渲染的数组 let use ...

  4. 【git】git回退到某个历史版本(强行推送代码)

    1. 使用git log命令查看所有的历史版本,获取某个历史版本的id,假设查到历史版本的id是139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96. 2. 3. 把修改推 ...

  5. linux date 格式化时间和日期

    [root@108test ~]# date -d today +"%Y-%m-%d" 2008-05-07   [root@108test ~]# date -d today + ...

  6. php的错误控制运算符

    php的错误控制运算符 PHP中提供了一个错误控制运算符“@”. 可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉: 如果开启了php.ini 中的 track_error ...

  7. php除法的知识点

    php除法的知识点 $a = 7; $b = 3; $c = $a/$b; var_dump($c);//float(2.3333333333333) //整数部分+小数点+小数部分=15位 $b = ...

  8. 从零开始写STL—哈希表

    static const int _stl_num_primes = 28; template<typename T, typename Hash = xhash<T>> cl ...

  9. POJ 2484 A Funny Game【博弈】

    相比数据结构的题..感觉这种想啊想的题可爱多了~~~代码量还少.... 题目链接: http://poj.org/problem?id=2484 题意: 一圈n个硬币,两人轮流从中取一或两个硬币,(只 ...

  10. [Bzoj2039]小Z的袜子 (莫队算法模板题)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 11866  Solved: 5318[Sub ...