POJ 2279 Mr. Young's Picture Permutations
题目链接:POJ 2279 Mr. Young's Picture Permutations
题目大意:
个学生站成排,每排分别有名学生。要求每排的学生的身高单调递增,而每一排的同位的同学的身高单调递减。求总的方案数。
题解:
注意到很小,我们就可以暴力状态了,而要表现单调递增,故维护一个从左至右边矮的阶梯。
以有列为例,设表示第列已经填的数字高度为,第列高度为,...,第列的高度为的,现在填到数字方案数,并保证转移时,于是当一个新的数字填的时候一定比所有的数字都要大。
递推式为:
边界:,其余为。
答案:。
#include <cstdio>
#include <cstring>
using namespace std;
int row, n[6];
int main() {
while (scanf("%d", &row) && row) {
memset(n, 0, sizeof(n));
for (int i = 1; i <= row; ++i) {
scanf("%d", &n[i]);
}
unsigned int f[n[1] + 1][n[2] + 1][n[3] + 1][n[4] + 1][n[5] + 1];
memset(f, 0, sizeof(f));
f[0][0][0][0][0] = 1;
for (int i1 = 0; i1 <= n[1]; ++i1) {
for (int i2 = 0; i2 <= n[2]; ++i2) {
for (int i3 = 0; i3 <= n[3]; ++i3) {
for (int i4 = 0; i4 <= n[4]; ++i4) {
for (int i5 = 0; i5 <= n[5]; ++i5) {
unsigned int t = f[i1][i2][i3][i4][i5];
if (i1 < n[1]) {
f[i1 + 1][i2][i3][i4][i5] += t;
}
if (i2 < n[2] && i1 > i2) {
f[i1][i2 + 1][i3][i4][i5] += t;
}
if (i3 < n[3] && i2 > i3) {
f[i1][i2][i3 + 1][i4][i5] += t;
}
if (i4 < n[4] && i3 > i4) {
f[i1][i2][i3][i4 + 1][i5] += t;
}
if (i5 < n[5] && i4 > i5) {
f[i1][i2][i3][i4][i5 + 1] += t;
}
}
}
}
}
}
printf("%u\n", f[n[1]][n[2]][n[3]][n[4]][n[5]]);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现