
POJ - 2279 Mr. Young's Picture Permutations 线性DP + 5维DP
初始化:dp[0][0][0][0][0] = 1,因为没有人站的情况有1种。 状态转移:从右到左构建排的位置,确保每一排和每一列的足够条件。 递推:考虑每个排的位置,同时满足列的递减条件,更新dp数组。 输入处理:读取输入的排每排人数,初始化动态规划数组。 状态初始化:dp[0][0][0][0][0] = 1,表示0排0人情况的初始状态。 动态规划递推:依次构建每排的位置,确保每列从后到前身高递减,更新dp数组的状态。 输出结果:最终输出第q[0]排、q[1]排、q[2]排、q[3]排、q[4]排对应的状态数。
发布日期:2021-05-20 04:54:41
浏览次数:15
分类:精选文章
本文共 2536 字,大约阅读时间需要 8 分钟。
为了解决问题,我们需要计算各组学生在给定约束下的排列方式数。学生站在k排,每排有不同的人数,并满足每排左到右身高递减,每列从后到前身高递减的条件。
方法思路
我们使用动态规划的方法来处理这个问题。设dp[i][j][k][l][m]表示当前i排有j个人,i+1排有k个人,i+2排有l个人,i+3排有m个人的某个状态转移。我们从排1的右端开始,然后依次向左构建每一排的可能排列和列的递减性质。
具体步骤如下:
- 每一排的右布局满足前一个排的约束。
- 每一列的游标向右移动,确保从后到前的身高递减。
解决代码
#include#include #include using namespace std;typedef long long ll;int main() { int n; int q[5]; while (scanf("%d", &n) != EOF) { for (int i = 0; i <= 4; ++i) q[i] = 0; for (int i = 0; i < n; ++i) { scanf("%d", &q[i]); } ll dp[q[0] + 1][q[1] + 1][q[2] + 1][q[3] + 1][q[4] + 1]; memset(dp, 0, sizeof(dp)); dp[0][0][0][0][0] = 1; for (int a = 0; a <= q[0]; ++a) { for (int b = 0; b <= q[1]; ++b) { for (int c = 0; c <= q[2]; ++c) { for (int d = 0; d <= q[3]; ++d) { for (int e = 0; e <= q[4]; ++e) { if (a > 0) { if (b >= a - 1) { dp[a][b][c][d][e] += dp[a - 1][a - 1][c][d][e]; } } if (b > 0) { if (c >= b - 1) { dp[a][b][c][d][e] += dp[a][b - 1][b - 1][d][e]; } } if (c > 0) { if (d >= c - 1) { dp[a][b][c][d][e] += dp[a][b][c - 1][c - 1][e]; } } if (d > 0) { if (e >= d - 1) { dp[a][b][c][d][e] += dp[a][b][c][d - 1][d - 1]; } } if (e > 0) { dp[a][b][c][d][e] += dp[a][b][c][d][e - 1]; } } } } } } cout << dp[q[0]][q[1]][q[2]][q[3]][q[4]] << endl; } return 0;}
代码解释
该方法通过多维递推,合理地处理了每排和列的身高递减约束,逐步构建可能的排列方案,确保了计算的正确性和效率。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月13日 14时15分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python IO编程
2019-03-06
CSS入门总结
2019-03-06
使用 TortoiseGit 时,报 Access denied 错误
2019-03-06
基于 HTML5 WebGL 的污水处理厂泵站自控系统
2019-03-06
django-表单之模型表单渲染(六)
2019-03-06
c++之程序流程控制
2019-03-06
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2019-03-06
有道云笔记 同步到我的博客园
2019-03-06
李笑来必读书籍整理
2019-03-06
Hadoop(十六)之使用Combiner优化MapReduce
2019-03-06
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2019-03-06
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2019-03-06
andriod 开发错误记录
2019-03-07
C语言编译错误列表
2019-03-07
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
python中列表 元组 字典 集合的区别
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07