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

P14367 [JOISC 2018] 帐篷 / Tents

思路

注意到重要性质:每确定一对帐篷,那么这对帐篷所在行和列不能放置其他帐篷,这将解释后来的方案之间为什么不会互相冲突。

考虑设计 \(dp_{ i , j }\) 表示营地大小 \(i\)\(j\) 列时的方案数,逐行计算,对于每一行的放置:

  • 若第 \(i\) 行不放,直接转移 \(dp_{ i , j } + = dp_{ i - 1 , j }\)

  • 若第 \(i\) 行放置一个,所在列没有其他帐篷,首先从 \(j\) 个位置里选出一个位置来放置,且由于所在行与列均没有其他帐篷,方向任取,那么 \(dp_{ i , j } + = \binom { j } { 1 } \times 4 \times dp_{ i - 1 , j - 1 }\)

  • 若第 \(i\) 行放置一个,与同列异行另一个帐篷配对,相比前一种情况方向不能任取,且需要乘上从前 \(i - 1\) 行里选出一行放置与之配对的帐篷的方案数,有 \(dp_{ i , j } + = \binom {j} { 1 } \times \binom { i - 1 } { 1 } \times dp_{ i - 2 , j - 1 }\)

  • 若第 \(i\) 行放置两个,则方向固定,只需 \(dp_{ i , j } + = \binom { j } { 2 } \times dp_{ i - 1 , j - 2 }\)

代码实现就很简单啦,我这里为了显示思路预处理了组合数,实际实现过程中 \(\times \binom { i } { 1 }\) 可以直接写作 \(\times i\),注意保证方案不能为空,答案需要减一。

Code

#include<iostream>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=3005;
const int MOD=1e9+7;
int n,m,fac[N],inv[N],dp[N][N];
int Quick_Pow(int a,int b)
{int res=1,base=a;while(b){if(b&1) res=1ll*res*base%MOD;base=1ll*base*base%MOD;b>>=1;}return res;
}
void Init(int n)
{fac[0]=1;for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%MOD;inv[n]=Quick_Pow(fac[n],MOD-2);for(int i=n-1;i>=0;i--)inv[i]=1ll*inv[i+1]*(i+1)%MOD;
}
int C(int n,int m)
{return 1ll*fac[n]*inv[m]%MOD*inv[n-m]%MOD;
}
int main()
{IOS;cin>>n>>m;Init(max(n,m));for(int i=0;i<=n;i++)dp[i][0]=1;for(int i=0;i<=m;i++)dp[0][i]=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[i][j]=dp[i-1][j];//不放dp[i][j]=(dp[i][j]+1ll*C(j,1)*4*dp[i-1][j-1]%MOD)%MOD;//放一个,且所在列没有其他帐篷dp[i][j]=(dp[i][j]+(i>=2)*1ll*C(j,1)*C(i-1,1)*dp[i-2][j-1]%MOD)%MOD;//放一个,与所在列另一帐篷相对dp[i][j]=(dp[i][j]+(j>=2)*1ll*C(j,2)*dp[i-1][j-2]%MOD)%MOD;//放两个}}cout<<dp[n][m]-1<<'\n';return 0;
}

完结撒花~

http://www.jsqmd.com/news/39231/

相关文章:

  • 代码加密技术 - 实践
  • P6532 [COCI 2015/2016 #1] TOPOVI
  • Apache Struts远程代码执行漏洞CVE-2025-12703解析
  • P9433 [NAPC-#1] Stage5 - Conveyors
  • P11038 【MX-X3-T5】「RiOI-4」Countless J-Light Decomposition
  • 【每日一面】BOM 是什么
  • P9638 「yyOI R1」youyou 的军训
  • P1012 [NOIP 1998 提高组] 拼数
  • 同步/异步和阻塞/非阻塞学习笔记
  • python 单词搜索(回溯-矩阵-字符串-中等)含源码(二十) - 指南
  • PHP生成RSA密钥对及RSA签名验证类库
  • 2025年杭州维修手机培训公司权威推荐榜单:手机维修教程/手机屏幕维修/维修手机源头公司精选
  • 2025年A2级防火抗倍特板批发厂家权威推荐榜单:高压耐火墙面装饰板/手HPL防火板/隧道防火装饰板源头厂家精选
  • 在基于FastAPI的Python开发框架后端,增加阿里云短信和邮件发送通知处理
  • 11月13日打卡
  • Comparative linguistics
  • 2025-11-11 PQ v.Next日志记录
  • ANT天线ESD防护
  • MATLAB离群点检测与删除
  • 2025短视频拍摄公司排名与推荐:3个核心标准帮你选对团队,避开无效投入
  • C#标签批量打印程序开发
  • 助力企业构建 AI 原生应用,函数计算 FunctionAI 重塑模型服务与 Agent 全栈生态
  • 小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇数据库篇MySQLMSSQLOracle自动化方案
  • vue2 混同,封装公共方法 - 东方不败-
  • 2025年PP多功能废气净化塔生产厂家权威推荐榜单:聚丙烯多功能废气净化塔/PPH多功能废气净化塔/PPH尾气吸收塔源头厂家精选
  • 2025年新疆初三复读班权威推荐榜单:中考复读快速提分/初三补习班/初三集训班源头服务商精选
  • source insight4菜单工具按钮变乱恢复
  • 2025 国产 ITSM 厂商选型全攻略:基础流程、智能赋能与全链路协同深度解析
  • 2025年新疆高三复读班权威推荐榜单:高三复读全日制/高三复读班/清北复读班学校精选
  • 2025年WMS仓库管理系统行业观察:智能仓储新格局加速成型