Link:

BZOJ 1801 传送门

Solution:

一眼看过去又像是状压$dp$的经典模型……

但此题$n,m\le 100$ ,直接跑状压只有50分

此时要发现这道题的特点:每行/列不能放置超过2个

既然每一列只可能有 不选/选1个/选2个 这三种状态,直接记录这三种状态的个数即可

于是设$dp[i][j][k]$为到第$i$行时,有$j$列放置了1个,有$k$列放置了2个的方案数

接下来分五种情况递推就行了

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=,MOD=;
int n,m,cur;
ll dp[][MAXN][MAXN],res; ll C(int a)
{return 1ll*a*(a-)/;} int main()
{
scanf("%d%d",&n,&m); dp[cur^][][]=;
for(int i=;i<=n;i++,cur^=)
for(int j=;j<=m;j++) for(int k=;j+k<=m;k++)
{
dp[cur][j][k]=dp[cur^][j][k];
if(k>=) (dp[cur][j][k]+=dp[cur^][j+][k-]*(j+))%=MOD;
if(j>=) (dp[cur][j][k]+=dp[cur^][j-][k]*(m-j-k+))%=MOD;
if(j>=) (dp[cur][j][k]+=dp[cur^][j-][k]*C(m-j-k+))%=MOD;
if(k>=) (dp[cur][j][k]+=dp[cur^][j+][k-]*C(j+))%=MOD;
if(k>=) (dp[cur][j][k]+=dp[cur^][j][k-]*j*(m-j-k+))%=MOD;
}
for(int i=;i<=m;i++) for(int j=;i+j<=m;j++)
(res+=dp[cur^][i][j])%=MOD;
printf("%lld",res);
return ;
}

Reviews:

感觉现在想问题还是太定式了

更重要的是找到每道题的特点

对于总状态数较少的题目直接记录每种状态的个数$dp$即可,仅当状态数过多状压

[BZOJ 1801] Chess的更多相关文章

  1. [BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】

    题目链接:BZOJ - 1801 题目分析 对于50%的数据是可以直接状压 DP 的. 对于100%的数据,使用递推的 DP .(或者这只叫递推不叫 DP ?) 可以发现,每一行和每一列的棋子个数不能 ...

  2. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

    dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...

  3. BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...

  4. bzoj 1801: [Ahoi2009]chess 中国象棋

    Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...

  5. bzoj 1801: [Ahoi2009]chess 中国象棋【dp】

    注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...

  6. BZOJ 1801中国象棋 DP

    1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1426  Solved: 826[Submit][ ...

  7. BZOJ 1801 AHOI2009 中国象棋 递归

    标题效果:给定一个棋盘.放置一些枪.它需要随机两支枪不能互相攻击,评估的数目p模值 首先,两炮不攻击对方自由地等同于一条线最多可有只有两个枪 直形压力DP话是50分 考虑到每个列是等效 然后我们就可以 ...

  8. DP【p2051(bzoj 1801)】 [AHOI2009]中国象棋.

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  9. JZOJ 1667 ( bzoj 1801 ) [ AHOI 2009 ] 中国象棋 —— DP

    题目:https://jzoj.net/senior/#main/show/1667 首先,一行.一列最多只有 2 个炮: 所以记录一下之前有多少行有 0/1/2 个炮,转移即可: 注意取模!小心在某 ...

随机推荐

  1. dva的基本用法

    dva是一个状态管理工具,整合了redux,redux-saga,react-router,fetch等框架,目前只能用于react的状态管理 1. dva的models dva的主要作用还是整合了r ...

  2. taotao购物车

    功能分析: 1.在用户不登陆的情况下也可以使用购物车,那么就需要把购物车信息放入cookie中. 2.可以把商品信息,存放到pojo中,然后序列化成json存入cookie中. 3.取商品信息可以从c ...

  3. 对Office文档进行授权

    Microsoft.Office.Interop.Word.ApplicationClass app = new Microsoft.Office.Interop.Word.ApplicationCl ...

  4. 7月16号day8总结

    今天学习过程和小结 1.列举Linux常用命令 shutdown now Linux关机 rebot重启 mkdir mkdir -p递归创建 vi/touth filename rm -r file ...

  5. Things To Do Before NOI2017

    TC div1 10套 数据结构 25题 网络流 10题 字符串 20题 数学 15题 图论 15题 计算几何 5题 提交答案 5题 嗯...先这些吧... 以上所有题目,博客都会有更新--- NOI ...

  6. codeforces739C - Skills &&金中市队儿童节常数赛

    http://codeforces.com/problemset/problem/739/C 先上链接 这道题 对于蒟蒻的我来说还是很有难度的 调了很久 对于我的代码 mx2是答案 mx1代表单调 m ...

  7. 关于C++随机函数

    #include<iostream> #include<cstdlib> #include<ctime> using namespace std; int main ...

  8. [BZOJ3275]Number解题报告|网络流

    Description 有N个正整数,需要从中选出一些数,使这些数的和最大.若两个数a,b同时满足以下条件,则a,b不能同时被选1:存在正整数C,使a*a+b*b=c*c2:gcd(a,b)=1 这道 ...

  9. bzoj 2748 DP

    比较裸的背包,w[i][j]代表到第I个操作的时候音量j能不能达到,然后转移就行了. /******************************************************** ...

  10. Linux下的两个经典宏定义【转】

    转自:http://www.linuxidc.com/Linux/2015-07/120014.htm 本文首先介绍Linux下的经典宏定义,感受极客的智慧,然后根据该经典定义为下篇文章作铺垫. of ...