POJ - 2279 Mr. Young's Picture Permutations 线性DP + 5维DP
发布日期: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的右端开始,然后依次向左构建每一排的可能排列和列的递减性质。

具体步骤如下:

  • 初始化:dp[0][0][0][0][0] = 1,因为没有人站的情况有1种。
  • 状态转移:从右到左构建排的位置,确保每一排和每一列的足够条件。
    • 每一排的右布局满足前一个排的约束。
    • 每一列的游标向右移动,确保从后到前的身高递减。
  • 递推:考虑每个排的位置,同时满足列的递减条件,更新dp数组。
  • 解决代码

    #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;
    }

    代码解释

  • 输入处理:读取输入的排每排人数,初始化动态规划数组。
  • 状态初始化:dp[0][0][0][0][0] = 1,表示0排0人情况的初始状态。
  • 动态规划递推:依次构建每排的位置,确保每列从后到前身高递减,更新dp数组的状态。
  • 输出结果:最终输出第q[0]排、q[1]排、q[2]排、q[3]排、q[4]排对应的状态数。
  • 该方法通过多维递推,合理地处理了每排和列的身高递减约束,逐步构建可能的排列方案,确保了计算的正确性和效率。

    上一篇:CH 5101 :LCIS(最长公共上升子序列) 线性DP (“代码等价转化”优化程序)
    下一篇:博弈论 Nim游戏 Staircase Nim阶梯尼姆 POJ 1704 Georgia and Bob

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月13日 14时15分53秒