题意

n×m的棋盘,放棋子,要求第i行左边lil_ili​个格子和右边rir_iri​个格子各恰好有一个棋子,且每一列最多只能有1个棋子,问方案数,对109+710^9+7109+7取模
n≤50,m≤200n\leq50,m\leq200n≤50,m≤200

Solution

这是一道DP好题。
太菜了以至于我想了半天连状态都没想到。
考虑到每一列最多放一个,那么考虑在列上做文章,设f[i][]f[i][]f[i][]表示做到了第i列……
然后怎么办呢,对于一列,假如一些行左区间到此为止了,那么就一定要将这些行放完,将这些行安排之前没有被放过的列;否则先把它们咕咕了。如果一些行的右区间从这一列开始,那么没有处理完的行就会多出几个。其次你也可以选择填在中间没有覆盖的地方。
如果这么考虑的话,状态就很好想了(可是就是没有这么考虑)
设f[i][j][k]f[i][j][k]f[i][j][k]表示做到了第i列,在之前有j列没有被放过棋子,有k行已经到了右区间。
记li,ri,midil_i,r_i,mid_ili​,ri​,midi​分别为左区间右端点为i、右区间左端点为i、i列没有区间覆盖住的行数
每一列的转移要添加ri+1r_{i+1}ri+1​的右区间放置机会,要将l[i+1]l[i+1]l[i+1]全部搞定。
初状态为f[0][0][0]=1f[0][0][0]=1f[0][0][0]=1
考虑三种转移:

  1. 不放在中间空着的,也不放在右区间,那么就要将li+1l_{i+1}li+1​行安排前面没放棋子的那j列f[i+1][j+1−li+1][k+ri+1]+=f[i][j][k]∗Aj+1li+1f[i+1][j+1-l_{i+1}][k+r_{i+1}]+=f[i][j][k]*A_{j+1}^{l_i+1}f[i+1][j+1−li+1​][k+ri+1​]+=f[i][j][k]∗Aj+1li​+1​
  2. 放在右区间f[i+1][j−li+1][k+ri+1−1]+=f[i][j][k]∗Ajli+1∗(k+ri+1)f[i+1][j-l_{i+1}][k+r_{i+1}-1]+=f[i][j][k]*A_j^{l_{i+1}}*(k+r_{i+1})f[i+1][j−li+1​][k+ri+1​−1]+=f[i][j][k]∗Ajli+1​​∗(k+ri+1​)
  3. 放在中间空着的位置f[i+1][j−li+1][k+ri+1]+=f[i][j][k]∗Ajli+1∗midi+1f[i+1][j-l_{i+1}][k+r_{i+1}]+=f[i][j][k]*A_j^{l_{i+1}}*mid_{i+1}f[i+1][j−li+1​][k+ri+1​]+=f[i][j][k]∗Ajli+1​​∗midi+1​
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define fo(i,a,b) for(int i(a),_E_(b);i<=_E_;++i)
#define REP(i,a,b) for(int i(a),_E_(b);i<_E_;++i)
#define fd(i,a,b) for(int i(a),_E_(b);i>=_E_;--i)
#define ll long long
#define mo 1000000007
#define N 52
#define M 210using namespace std;int f[M][M][N],l[M],r[M],mid[M],n,m,p[M][M];int main(){scanf("%d %d",&n,&m);fo(i,0,m){p[i][0]=1;fo(j,1,i)p[i][j]=1ll*p[i][j-1]*(i-j+1)%mo;}fo(i,1,n){int L,R;scanf("%d %d",&L,&R);++l[L];++r[m-R+1];++mid[L+1];--mid[m-R+1];}fo(i,2,m)mid[i]+=mid[i-1];f[0][0][0]=1;REP(i,0,m)fo(j,0,i)fo(k,0,n)if(f[i][j][k]){if(j+1>=l[i+1])(f[i+1][j+1-l[i+1]][k+r[i+1]]+=1ll*p[j+1][l[i+1]]*f[i][j][k]%mo)%=mo;if(j>=l[i+1]&&k+r[i+1])(f[i+1][j-l[i+1]][k-1+r[i+1]]+=1ll*p[j][l[i+1]]*(k+r[i+1])%mo*f[i][j][k]%mo)%=mo;if(j>=l[i+1])(f[i+1][j-l[i+1]][k+r[i+1]]+=1ll*p[j][l[i+1]]*mid[i+1]%mo*f[i][j][k]%mo)%=mo;}int ans=0;fo(i,0,m)ans=(ans+f[m][i][0])%mo;printf("%d",ans);return 0;
}

【51nod1327】棋盘游戏相关推荐

  1. 51nod1327 棋盘游戏 [dp]

    Description: 有一个NNN行M" role="presentation" style="position: relative;">M ...

  2. 从α到μ:DeepMind棋盘游戏AI进化史

    2020-02-04 13:52:45 选自towardsdatascience 作者:Connor Shorten 机器之心编译 参与:Panda.蛋酱 alpha(α)是希腊字母表的第 1 个字母 ...

  3. 3*3 c语言,C语言实现小游戏(三) 3*3棋盘游戏

    实现3*3棋盘游戏主要流程: 一.定义一些所需要的函数 1.定义初始化棋盘函数:void init(char arr[3][3],int i,int j ); 2.定义打印棋盘函数:int prit( ...

  4. HD1281棋盘游戏(匹配+好题)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. java简单纸牌游戏_2020年最佳2人棋盘游戏:拼凑,Kingdomino等

    假期呆在房子里?这些是打发时间的完美游戏. 由于持续不断的 危机,今年的假期可能看起来要安静 得多.但是安静不一定意味着坏.我们中的大多数人都将放弃大型聚会,如果您要在家中聚会,那么 棋盘游戏 是打发 ...

  6. 【c语言】棋盘游戏--三子棋

    一.问题概述 大家都玩过棋盘游戏吧,像五子棋一样,玩家或者是电脑一人下一次,当玩家或者是电脑的某一方先将各自的五个棋子下成一条线时,谁就赢,棋盘游戏就会结束. 当然,我今天要介绍的是三子棋,和五子棋的 ...

  7. hdu 1281 棋盘游戏 (二分匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. HDU 1281:棋盘游戏

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. h5棋牌游戏源码 java_YM202H5房ka微信贝密棋盘游戏平台,完整全套游戏源码下载...

    H5房ka微信贝密棋盘游戏平台,完整全套游戏源码下载,UI设计以及后台系统(JAVA)开发,包含了前端UI. 开发工具:Cocos Creater 开发语言:Java + JavaScript 服务端 ...

最新文章

  1. vs2015添加vc助手
  2. Ubuntu 安装LAMP ...
  3. 普通用户Mysql 5.6.13 主从,主主及nagios的mysql slave监控
  4. .Net Core中IOC容器的使用
  5. Illustrator 上色
  6. 离线语音识别软件_6.语音板使用科大讯飞离线命令词识别
  7. php获取远程图片模拟post,file上传到指定服务器
  8. 在 PyCharm 中写代码
  9. 类似纪念碑谷的unity2d素材包_《纪念碑谷》:引领小清新风格的2.5D插画风游戏...
  10. oracle连接no listener
  11. python中扑克牌类设计_创建扑克牌类Python
  12. 操作系统——进程的状态与转换
  13. 新手操作低客单价时常见的误区有哪些?
  14. python语言是什么语言
  15. 换挡周期下,谁将成为厨电品牌的进取者?
  16. windows server2012安全配置—停用Guest帐号的方法
  17. 周易六十四卦——否卦
  18. 国家开放大学2021春1194建设监理题目
  19. 一个汉字占几个字节的问题
  20. 用户输入商品价格和商品数量,以及收货地址,可以自动打印订单信息 分析:

热门文章

  1. 错误 101 (net::ERR_CONNECTION_RESET):连接已重置
  2. 课堂上学生的经典插嘴
  3. 父Shell与子Shell
  4. No module named ‘_lzma’
  5. 智能合约和去中心化应用DAPP
  6. BUUCTF-Misc-认真你就输了
  7. antd 每次打开modal 初始化数据
  8. 评央企员工持股时隔11年将重启 个人比例不超5%
  9. Android基础-Facebook Rebound 弹性动画库 源码分析
  10. macOS系统升级(vmware虚拟机安装)