当前位置: 首页 > news >正文

P1350 车的放置 【洛谷算法习题】

P1350 车的放置

网页链接

P1350 车的放置

题目描述

有下面这样的一个网格棋盘,a , b , c , d a,b,c,da,b,c,d表示了对应边长度,也就是对应格子数:

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

要在这个棋盘上放k kk个相互不攻击的车,也就是这k kk个车没有两个车在同一行,也没有两个车在同一列,问有多少种方案。

输入格式

只有一行,为五个非负整数,分别代表a , b , c , d a,b,c,da,b,c,dk kk

输出格式

输出一行一个整数代表答案m o d \bmodmod10 5 + 3 10^5+3105+3后的结果。

输入输出样例 #1

输入 #1

2 2 2 2 2

输出 #1

38

说明/提示

数据规模与约定
  • 存在部分数据,保证b = 0 b=0b=0
  • 存在部分数据,保证a , b , c , d ≤ 4 a,b,c,d\leq 4a,b,c,d4
  • 对于100 % 100\%100%的数据,保证0 ≤ a , b , c , d , k ≤ 10 3 0\leq a,b,c,d,k\leq 10^30a,b,c,d,k103,且至少有一种可行方案。

解题思路

本题是L形棋盘的不攻击车放置计数问题,采用动态规划按列递推求解,全程对 100003 取模。
棋盘可拆分为共a + c a+ca+c列:其中c cc列仅下半部分有d dd行格子,剩余a aa列上下连通,共有b + d b+db+d行格子。定义状态f[i][j]表示前i ii列放置j jj个互不攻击的车的方案数。
状态转移分两种情况:

  1. 第i列不放车:方案数直接继承前i − 1 i-1i1列放j jj个车的结果,即f[i][j] += f[i-1][j]
  2. 第i列放车:前i − 1 i-1i1列已放置j − 1 j-1j1个车,占用了j − 1 j-1j1个不同行;当前列有v [ i ] v[i]v[i]个格子,因此可选行数为v [ i ] − ( j − 1 ) v[i] - (j-1)v[i](j1),贡献方案数f[i][j] += f[i-1][j-1] * (v[i] - j + 1)
    初始状态f[0][0] = 1,所有列放置0个车的方案数均为1。最终f[a+c][k]即为答案。算法时间复杂度O ( ( a + c ) ⋅ k ) O((a+c) \cdot k)O((a+c)k),完全适配题目千级的数据范围。

总结

核心逻辑:将L形棋盘按列拆分,通过动态规划逐列递推,利用“车不同行不同列”的约束计算合法放置方案数。
关键操作:拆分棋盘得到每列的行数、定义二维DP状态、按“放/不放车”两种情况完成状态转移、全程取模。
效率保障:DP数组规模仅为2000×1000,线性递推无冗余运算,运行效率极高。

代码简要说明

  1. 列高度数组v:前c列对应高度为d(仅下半部分有格子),后a列对应高度为b+d(上下两部分连通),匹配L形棋盘结构。
  2. DP初始化f[0][0] = 1,且所有前i列放置0个车的方案数初始化为1,作为递推边界。
  3. 状态转移:双重循环遍历所有列与车数,分别累加“不放车”和“放车”的方案数,每次运算后对100003取模。
  4. 结果输出:最终输出f[a+c][m],即为放置m个互不攻击的车的总方案数。

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;constll SZ=2005;ll f[SZ][SZ],v[SZ];ll a,b,c,d,m,mo=100003;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&m);for(ll i=1;i<=c;i++)v[i]=d,f[i][0]=1;for(ll i=1;i<=a;i++)v[c+i]=d+b,f[c+i][0]=1;f[0][0]=1;for(ll j=1;j<=a+c;j++)for(ll i=1;i<=m;i++)f[j][i]=(f[j-1][i]+f[j-1][i-1]*(v[j]-i+1))%mo;printf("%lld",f[a+c][m]);return0;}
http://www.jsqmd.com/news/1026350/

相关文章:

  • DeferredResult和Callable用起来总超时?可能是你的Tomcat或Undertow配置没跟上
  • 避坑指南:TCA9548A切换I2C通道时,STM32 HAL库这些细节不注意就白忙活了
  • 2026年幼儿园儿童小便器推荐深度测评:如何为你的场景匹配最佳方案? - 资讯快报
  • 永磁同步电机MPTC仿真翻车实录:我的转矩波形为什么抖得比论文里厉害?
  • RTOS多任务下的I2C通信:用FreeRTOS信号量实战解决温湿度传感器与光照传感器的总线竞争
  • 宝安区2026年跳绳体能班内幕:新手家长需知的收费底线与行业乱象 - 资讯快报
  • 2026 西安地暖房卫生间管根漏水维修推荐?调研 5 家本地靠谱防水施工单位 - 防水资讯
  • 国内防静电无尘布厂家综合实力排行及核心能力解析 - 资讯快报
  • FreeRadius实战避坑指南:从‘Ignoring request’到成功认证,我踩过的那些坑(华为AP+Ubuntu)
  • 在Windows上找回Apple触控板原生体验:mac-precision-touchpad驱动完全指南
  • Webots仿真避坑实录:从URDF到PROTO,我遇到的5个典型错误及解决方法
  • 2026Q2深圳代理记账公司权威推荐深圳犇诚汇财税顾问公司 - 幸福生活序曲
  • 从共享文件夹消失到复制粘贴失灵:手把手教你用终端命令修复VMware那些‘玄学’Bug
  • MPC8360E PCI控制器寄存器配置与错误管理实战解析
  • Kinetis SDK 2.0.0架构解析与嵌入式开发实战指南
  • 2026佛山直营装修标杆测评:星艺装饰(佛山直营)凭硬核实力领跑本地家装市场 - Guangdong1
  • SpringBoot项目整合OpenAI API实战:从代理配置到解决429错误的完整避坑指南
  • 避开这些坑!在ZYNQ7020上部署MNIST神经网络时,我遇到的5个典型问题与解决方案
  • MPC8360E I2C EEPROM启动配置与时钟系统设计实战指南
  • 苹果设备必备!2026免费音频转M4A在线保姆级教学,无限制使用一键搞定 - 时时资讯
  • 2026 惠州卫生间地漏漏水不用砸砖修复?5 家本地口碑防水服务商实测分享 - 防水资讯
  • 国内高端防静电工作服厂家综合实力排行Top5 - 资讯快报
  • Gifski实战配置:解决macOS视频转GIF兼容性与性能优化完整方案
  • 关于自动卷线器厂家排名,4大问题一文说清 - 资讯快报
  • Python新手必看:用with open()读文件总报错?这5个检查步骤帮你搞定FileNotFoundError
  • 终极键盘防抖解决方案:如何彻底解决机械键盘连击问题
  • 2026年最新国内梭织无尘布厂家综合实力排行(2026年6月版) - 资讯快报
  • fdisk与parted分区限制详解:彻底弄懂MBR 2TB限制与GPT无限制差异
  • 自动卷线器企业排名:6个事搞懂再选不后悔 - 资讯快报
  • 嵌入式调试实战:通过debugfs访问QorIQ硬件寄存器