Mr. Young‘s Picture Permutations

Mr. Young's Picture Permutations

看了李煜东老师的答案。

对dp的转移有了一点别的理解。

之前都是按y总那样考虑当前状态是由那些状态转移过来的。

这道题目看算阶上的思考方式,考虑的是当前状态能够转移到那些状态。

更具体点就是说,考虑 f i j k l r fijklr fijklr我可以把这一个人放在哪一行。
f i + 1 j k l r fi+1jklr fi+1jklr就是把这个人放在第一行。

也就是 f i j k l r fijklr fijklr可能能转移到 f i + 1 j k l r fi+1jklr fi+1jklr

但是转移是需要满足条件的

也就是满足按行递增、按列递增

考虑从1~n去放,第一行一定能放这是没有问题的。

也就是第一行只需要满足 i < a 1 i<a1 i<a1就可以放

其他的行需要额外满足按列递增也就是要放的这一行的这一列它的上一行之前一定已经放过数了。也就是如下图,只有前面放过数了才能保证按列是递增的,行就没有这个问题,因为行本身就能保证这个性质。

总结:真的是很不错的dp题目,第一道就给了我一个下马威。

  1. dp题要算一下空间可能会爆空间。
  2. 多测,清数组要清干净。不然wa到自闭。
cpp 复制代码
#include <bits/stdc++.h>

#define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define fep(i, a, b) for(int i = (a); i >= (b); --i)
#define _for(i, a, b) for(int i=(a); i<(b); ++i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define fs first
#define sc second
#define pb push_back
#define vi vector<int>

using namespace std;
const int maxn = 2e5 + 10;
int n;
int a[10];

void solve()
{

    while (cin >> n && n)
    {
        memset(a,0,sizeof(a));
        rep(i, 1, n)
        {
            cin >> a[i];
        }

        int f[a[1]+3][a[2]+3][a[3]+3][a[4]+3][a[5]+3];
        memset(f,0,sizeof(f));
        f[0][0][0][0][0] = 1;
        rep(i, 0, a[1])
        {
            rep(j, 0, a[2])
            {
                rep(k, 0, a[3])
                {
                    rep(l, 0, a[4])
                    {
                        rep(r, 0, a[5])
                        {
                            if (i < a[1])
                            {
                                f[i + 1][j][k][l][r] += f[i][j][k][l][r];
                            }
                            if (i > j)
                            {
                                f[i][j + 1][k][l][r] += f[i][j][k][l][r];
                            }
                            if (j > k)
                            {
                                f[i][j][k + 1][l][r] += f[i][j][k][l][r];
                            }
                            if (k > l)
                            {
                                f[i][j][k][l + 1][r] += f[i][j][k][l][r];
                            }
                            if (l > r)
                            {
                                f[i][j][k][l][r + 1] += f[i][j][k][l][r];
                            }
                        }
                    }
                }
            }
        }
        int ans = f[a[1]][a[2]][a[3]][a[4]][a[5]];
        cout << ans << '\n';
    }

}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
//    freopen("C:\\Users\\24283\\CLionProjects\\untitled2\\1.in", "r", stdin);
    solve();
    return 0;
}
相关推荐
苏苏susuus4 小时前
核密度估计(KDE)与高斯核(概念分享)
人工智能·python·ocr
宸津-代码粉碎机5 小时前
微服务线上踩坑复盘:接口超时、负载倾斜隐形问题根治方案(生产级配置)
java·大数据·人工智能·python·spring
速易达网络5 小时前
Python + Tkinter 实现基于 TCP/IP 的局域网聊天工具
python·信息与通信
多多鼠5 小时前
System Prompt 的“版本漂移”问题:从变更管理到 A/B 测试体系
开发语言·网络·人工智能·python·langchain
昔我往昔5 小时前
pytest日志问题排查记录
python·pytest
Python自动化直播6 小时前
用 Python 爬虫给 AI 直播间做数据反馈机制
人工智能·python·ai·直播
努力学习的代码小白6 小时前
源码学习04
python
Ray Wang7 小时前
Context上下文工程
python·学习·ai编程
小蒜学长7 小时前
基于RFID技术的仓储管理系统设计(代码+数据库+LW)
java·数据库·spring boot·后端·rfid技术·仓储管理
梦影_7 小时前
Langchain简单快速上手教程(五)——聊天模型之流式传输
java·数据库·人工智能·python·langchain