同1801

注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行

所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数

然后分情况讨论转移就行了

#include<cstdio>
#include<iostream>
using namespace std;
const int N=105,mod=999983;
long long n,m,f[N][N][N],ans;
int main()
{
scanf("%lld%lld",&n,&m);
f[0][0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=m-j;k++)
{
f[i][j][k]=f[i-1][j][k];
if(j>=1)
f[i][j][k]=(f[i][j][k]+(f[i-1][j-1][k]*(m-j+1ll-k))%mod)%mod;
if(k>=1&&j+1<=m)
f[i][j][k]=(f[i][j][k]+(f[i-1][j+1][k-1]*(j+1ll))%mod)%mod;
if(j>=2)
f[i][j][k]=(f[i][j][k]+(f[i-1][j-2][k]*((m-j+2ll-k)*(m-j+1ll-k)/2)%mod)%mod)%mod;
if(k>=2&&j+2<=m)
f[i][j][k]=(f[i][j][k]+(f[i-1][j+2][k-2]*((long long)(j+2ll)*(long long)(j+1ll)/2)%mod)%mod)%mod;
if(j>=1&&k>=1)
f[i][j][k]=(f[i][j][k]+(f[i-1][j][k-1]*(long long)j%mod*(m-j-k+1)%mod)%mod)%mod;
if(i==n)
ans=(ans+f[i][j][k])%mod;
}
printf("%lld\n",ans);
return 0;
}

bzoj 4806: 炮【dp】的更多相关文章

  1. Bzoj 4806 炮 (dp)

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

  2. bzoj 4806 炮

    Written with StackEdit. Description 众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子". 炮跟炮 ...

  3. BZOJ 4806 - 4809 象棋四题

    4806: 炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 103  Solved: 72[Submit][Status][Discuss] Des ...

  4. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

  5. bzoj4806 炮——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4806 看到这题首先会想到状压什么乱七八糟的,然而很难做: 其实,因为求的是方案数,所以并不需 ...

  6. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  7. BZOJ 1040 树形DP+环套树

    就是有n个点n条边,那么有且只有一个环那么用Dfs把在环上的两个点找到.然后拆开,从这条个点分别作树形Dp即可. #include <cstdio> #include <cstrin ...

  8. bzoj 3851: 2048 dp优化

    3851: 2048 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 22  Solved: 9[Submit][Status] Description T ...

  9. BZOJ 1068 (区间DP)

    题意:字符串的压缩,f[l][r][0]代表还没M,f[l][r][1]代表有M. #include<cstdio> #include<cmath> #include<c ...

随机推荐

  1. Leetcode 220.存在重复元素III

    存在重复元素III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. ...

  2. 添物不花钱学JavaEE(基础篇)-XML

    XML(Extensible Markup Language) XML在日常工作中经常用到,必须有个了解,不过认识一下即可,不要太浪费时间.实际用到 参考图书 <XML入门经典>大而全,不 ...

  3. 看板娘 & 二次元 & live2d

    live2d https://l2dwidget.js.org/dev.html https://github.com/xiazeyu/live2d-widget.js 看板娘 要切换看板娘吗? ht ...

  4. english & utils & tools

    english & utils & tools https://openlanguage.com/ https://www.grammarly.com/blog/email-writi ...

  5. 2018/2/27 Activiti教程之创建流程篇(与Springboot整合版)一

    因为电脑还在托运中,现在手上这台垃圾电脑实在是没法玩微服务,所以趁着这两天玩玩Activiti吧. 说实话,在学习Activiti中走了N多弯路,最大的原因就是网上没有一个完整(好)的教程,甚至连官方 ...

  6. msp430入门编程03

    msp430的C标识符和关键字 msp430入门学习 msp430入门编程

  7. BZOJ——2190: [SDOI2008]仪仗队

    思路: 我们将其所在的位置设为(0,0),那么如果存在一个点(x,y),且有gcd(x,y)=k(k!=1),那么点(x/k,y/k)一定会将(x,y)挡住.而如果k=1,那么点(x,y)就一定会被看 ...

  8. Swap Nodes in Pairs(链表操作)

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  9. Python/Java程序员面试必备常用问题解析与答案

    转自AI算法联盟,理解python技术问题,以及一些常见的java面试中经常遇到的问题,这些面试问题分为四类: 是什么(what) 如何做(how) 说区别/谈优势(difference) 实践操作( ...

  10. 003 rip

    r0#config t Enter configuration commands, one per line.  End with CNTL/Z. r0(config)#router rip r0(c ...