一、题目描述:

  给你一个网格棋盘,a,b,c,d 表示了对应边长度,也就是对应格子数。

  例如,当 a=b=c=d=2 时,对应了下面这样一个棋盘:

          

  想要在这个棋盘上放 k 棋子,也就是这 k 个棋子没有两个在同一行,也没有两个在同一列,问有多少种方案。

  答案对 1e5+3 取模。数据保证 0 <= a,b,c,d,k <= 1e3,且至少有一种可行方案。


二、解题思路:

  棋子是一行一行、一列一列的攻击的,所以我们可以一列一列的 dp 。

  设 f[i][j] 表示前 i 列放 j 个棋子的方案数,s[i] 表示第 i 列的方格数。

  容易得到状态转移方程:f[i][j]=f[i-1][j]+f[i-1][j-1]*(s[i]-(j-1))。

  其实很好理解:

  第 i 列不放棋子的情况下,f[i][j]+=f[i-1][j]。这种情况不用说了吧?

  第 i 列要放棋子的情况下,f[i][j]+=f[i-1][j-1]*第 i 列可以放棋子的位置数量。

  

  关于第 i 列可以放棋子的位置数量:

  一列一列地来看,我们 dp 方程一列本来就最多放一个,不用管。

  一行一行地来看,f[i-1][j-1]表示前 i-1 行放了 j-1 个棋子。

  一个棋子占据一行,其实就是第 i 列有 j-1 行不能放了。

  那么还剩下 s[i]-(j-1) 个位置,f[i][j]+=f[i-1][j-1]*(s[i]-(j-1))。

  但其实还有一个问题(困扰了我很久):

  如果 i-1 列有一些行是第 i 列没有的怎么办?例如最上面的图。

  转移从左往右数的第 3 列时,第 2 列的方案里有一些是棋子放在了上面两行。

  这些棋子显然不会占据第 3 列的空位,但状态转移方程会 默认占用第 3 行的空位,导致方案数减少。

  

  怎么解决呢?

  显然只有 s[i-1]>s[i] 才会出现这种问题,所以从右往左倒着转移就好了!


三、完整代码:

 1 #include<iostream>
2 #define N 2010
3 #define M 100003
4 using namespace std;
5 int a,b,c,d,k;
6 int s[N],f[N][N];
7 int main()
8 {
9 cin>>a>>b>>c>>d>>k;
10 for(int i=1;i<=a;i++) s[i+c]+=b;
11 for(int i=0;i<=a+c;i++) s[i]+=d+1,f[i][0]=1;
12 for(int i=1;i<=a+c;i++)
13 for(int j=1;j<=k;j++)
14 f[i][j]=(f[i-1][j-1]*(s[i]-j)+f[i-1][j])%M;
15 cout<<f[a+c][k]<<'\n';
16 return 0;
17 }

四、写题心得:

  好了,总算把这题想明白了,状态转移方程也是自己推的。很好,加油!

P1350 车的放置 题解的更多相关文章

  1. 洛谷 P1350 车的放置

    洛谷 P1350 车的放置 题目描述 有下面这样的一个网格棋盘,a,b,c,d表示了对应边长度,也就是对应格子数. 当a=b=c=d=2时,对应下面这样一个棋盘 要在这个棋盘上放K个相互不攻击的车,也 ...

  2. P1350 车的放置

    P1350 车的放置 设$f[i][j]$为当前推到第$i$列,该列高度$h$,已经放了$j$个车的方案数 则$f[i][j]=f[i-1][j]+f[i-1][j-1]*(h-j+1)$ 但是我们发 ...

  3. 【题解】洛谷P1350 车的放置(矩阵公式推导)

    洛谷P1350:https://www.luogu.org/problemnew/show/P1350 思路 把矩阵分为上下两块N与M 放在N中的有i辆车 则放在M中有k-i辆车 N的长为a   宽为 ...

  4. 【CH6802】车的放置

    题目大意:给定一个 N*M 的棋盘,棋盘上有些点不能放置任何东西,现在在棋盘上放置一些车,问最多可以放置多少个车而不会互相攻击. 题解:将放置一个车看作连接一条无向边,因为每一行和每一列之间只能放置一 ...

  5. 【u022】车的放置

    [问题描述] [题解] 先考虑一个最简单的情况.如一个n*n的棋盘.然后要放k个车. 我们可以先选出k行即C(n,k); 然后在列上对这k个棋子进行一次全排列即A(n,k); 比如k = 4;N=5 ...

  6. hdu1281(棋盘游戏,车的放置)

    Problem Description 给定一个n * m的棋盘,在棋盘里放尽量多的国际象棋中的车,使他们不能相互攻击 已知有些格子不能放置,问最多能放置多少个车 并计算出必须棋盘上的必须点. Inp ...

  7. 51NOD 1559:车和矩形——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在 ...

  8. AcWing P378 骑士放置 题解

    Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostr ...

  9. loj题目总览

    --DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...

  10. XVIII Open Cup named after E.V. Pankratiev. GP of Romania

    A. Balance 不难发现确定第一行第一列后即可确定全部,列不等式单纯形求解线性规划即可. #include<cstdio> #include<algorithm> usi ...

随机推荐

  1. RKO队——冲刺随笔(5)

    这个作业属于哪个课程 至诚软工实践F班 这个作业要求在哪里 第五次团队作业:项目冲刺 这个作业的目标 记录冲刺计划.要求包括当天会议照片.会议内容以及项目燃尽图(项目进度) 1.昨日进展 小程序大致完 ...

  2. Audition导入视频文件出现错误

    错误: We were unable to open this file using any of the currently available importers. If you would li ...

  3. 京东-Docker

    关于 Docker 版本的<使用与更新>教程修订日期:2021年 3 月 14 日ㅤ 一.基础使用教程1. 进入与退出容器:docker exec -it jd /bin/bash注意:e ...

  4. npm & cnpm 淘宝源

    前提:如果确实需要多版本的情况可以使用nvm 可以方便的安装和切换多版本! --nvm ls --nvm use 12.4.0 永久npm 设置淘宝源npm config set registry h ...

  5. Ubuntu 20.24 安装Postgresql 14

      1.运行环境 WSL+Ubuntu 20.04   2.安装Postgresql 进入Linux命令行,参照Postgresql官网安装指南 # Create the file repositor ...

  6. 关于tomcat部署web服务方式

    方式1.apache-tomcat-8.0.47\webapps文件夹下放war包会自动解压.文件夹名称就是访问路径 方式2.apache-tomcat-8.0.47\conf\Catalina\lo ...

  7. 《MySQL是怎样运行的》第六章小结

  8. SpringBoot笔记--Failed to read candidate component class报错的解决

    问题解决 形成该错误的原因就是Spring依赖和我们所使用的JDK版本不匹配 更详细一点的话,要解决这个问题,我们就需要升高Spring版本或者降低JDK版本即可解决 否则不能够在网页里面找到Tomc ...

  9. 如何规避MyBatis使用过程中带来的全表更新风险

    作者:京东零售 贾玉西 一.前言 程序员A: MyBatis用过吧? 程序员B: 用过 程序员A: 好巧,我也用过,那你遇到过什么风险没?比如全表数据被更新或者删除了. 程序员B: 咔,还没遇到过,这 ...

  10. Go内存管理逃逸分析

    1. 前言 所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定. 函数中申请一个新的对象 如果分配在栈中, 则函数执行结束后可自动将内存回收 如果分配在堆 ...