bzoj4806 炮——DP
题目: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的更多相关文章
- BZOJ4806(SummerTrainingDay03-K dp)
炮 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 464 Solved: 243[Submit][Status][Discuss] Descript ...
- bzoj4806 炮
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 这种题应该想状压的. 于是发现压不下,结合每一行每一列最多放两个炮想到记一下放炮的列就 ...
- 【bzoj4806~bzoj4808】炮车马后——象棋四连击
bzoj4806——炮 题目传送门:bzoj4806 这种题一看就是dp...我们可以设$ f[i][j][k] $表示处理到第$ i $行,有$ j $列没放炮,$ k $列只放了一个炮.接着分情况 ...
- 炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...
- 2018.07.22哨戒炮 II(树形dp)
哨戒炮 II 描述 你的防线成功升级,从原来的一根线变成了一棵树.这棵树有 N 个炮台,炮台与炮台之间 有 N-1 条隧道.你要选择一些炮台安装哨戒炮.在第 i 个炮台上安装哨戒炮得到的防御力为 vi ...
- Bzoj 4806 炮 (dp)
题目描述 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘 ...
- Luogu4345 SHOI2015 超能粒子炮·改 Lucas、数位DP
传送门 模数小,还是个质数,Lucas没得跑 考虑Lucas的实质.设\(a = \sum\limits_{i=0}^5 a_i 2333^i\),\(b = \sum\limits_{i=0}^5 ...
- [BZOJ4591][SHOI2015]超能粒子炮·改(Lucas定理+数位DP)
大组合数取模可以想到Lucas,考虑Lucas的意义,实际上是把数看成P进制计算. 于是问题变成求1~k的所有2333进制数上每一位数的组合数之积. 数位DP,f[i][0/1]表示从高到低第i位,这 ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
随机推荐
- 【贪心+前缀】C. Fountains
http://codeforces.com/contest/799/problem/C [题意] 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 ...
- vagrant的学习之Git学习
vagrant的学习之Git学习 参考学习网址: http://www.runoob.com/git/git-install-setup.html. http://www.bootcss.com/p/ ...
- Linux审计sudo
Linux日志审计项目案例实战(生产环境日志审计项目解决方案) https://www.linuxidc.com/Linux/2015-07/120501.htm
- python学习之 - XML
xml模块定义:实现不同语言或程序之间进行数据交换的协议.格式如下:通过<>节点来区别数据结构如:<load-on-startup(这个是标签) test="value&q ...
- 关于用String Calender类 计算闰年的Demo
package cn.zmh.zuoye; import java.util.Calendar; public class StringRun { public static void main(St ...
- 在Studio中使用Access数据库时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”
错误提示:
- 使用Python实现一个简单的项目监控
在公司里做的一个接口系统,主要是对接第三方的系统接口,所以,这个系统里会和很多其他公司的项目交互.随之而来一个很蛋疼的问题,这么多公司的接口,不同公司接口的稳定性差别很大,访问量大的时候,有的不怎么行 ...
- js:简单的拖动效果
效果演示:https://jsfiddle.net/dwqs/b5ywws9f/embedded/result/ html: <div class="wrap"> &l ...
- HDU OJ Max sum 题目1003
#include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; i ...
- [LeetCode][Java] Roman to Integer
题目: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...