题解【AcWing271】杨老师的照相排列

题面

经典的线性 \(\text{DP}\) 。

设 \(dp_{a,b,c,d,e}\) 表示第 \(1\) 排有 \(a\) 个人,第 \(2\) 排有 \(b\) 个人, 第 \(3\) 排有 \(c\) 个人, 第 \(4\) 排有 \(d\) 个人, 第 \(5\) 排有 \(e\) 个人的方案数。

初始化 \(dp_{0,0,0,0,0}=1\) 。

可以发现一个性质:前排的人数一定比后排的人数多。

转移可以参考代码。

#include <bits/stdc++.h>
#define DEBUG fprintf(stderr, "Passing [%s] line %d\n", __FUNCTION__, __LINE__)
#define itn int
#define gI gi

using namespace std;

typedef long long LL;
typedef pair <int, int> PII;
typedef pair <int, PII> PIII;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return f * x;
}

const int maxn = 33;

int n, m, k, s[maxn];
LL dp[maxn][maxn][maxn][maxn][maxn];

int main()
{
    //freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);
    while (1)
    {
        n = gi();
        if (n == 0) break;
        memset(s, 0, sizeof(s));
        for (int i = 1; i <= n; i+=1) s[i] = gi();
        //初始化
        memset(dp, 0, sizeof(dp));
        dp[0][0][0][0][0] = 1;
        //枚举每一排的人数
        for (int a = 0; a <= s[1]; a+=1)
        {
            for (int b = 0; b <= min(a, s[2]); b+=1)
            {
                for (int c = 0; c <= min(b, s[3]); c+=1)
                {
                    for (int d = 0; d <= min(c, s[4]); d+=1)
                    {
                        for (int e = 0; e <= min(d, s[5]); e+=1)
                        {
                            LL &v = dp[a][b][c][d][e];
                            //转移
                            if (a && a - 1 >= b) v += dp[a - 1][b][c][d][e];
                            if (b && b - 1 >= c) v += dp[a][b - 1][c][d][e];
                            if (c && c - 1 >= d) v += dp[a][b][c - 1][d][e];
                            if (d && d - 1 >= e) v += dp[a][b][c][d - 1][e];
                            if (e) v += dp[a][b][c][d][e - 1];
                        }
                    }
                }
            }
        }
        //输出结果
        printf("%lld\n", dp[s[1]][s[2]][s[3]][s[4]][s[5]]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/xsl19/p/12298519.html

时间: 2024-11-05 20:36:26

题解【AcWing271】杨老师的照相排列的相关文章

COJ 0500 杨老师的路径规划(MST)最小生成树

杨老师的路径规划(MST) 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 为满足同学们需求,杨老师在实验楼4层新建了好多个计算机教室供同学们使用.可是这样的话,由于路径很长,杨老师发现越来越难亲自走到每一个机房看看同学们有没有在玩游戏了.请你现在帮杨老师设计一个程序,给你每个教室间的路径长,设计出一条路线使每两个教室间都能联通且总长度最小,你只需要输出这个最小值即可.(裸MST) 输入 测试用例的第1行给出教室数目N ( 

勤奋的杨老师

题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单,共有n个知识点.但是清单中的知识并不是一定要学习的,可以在不改变先后顺序的情况下有选择的进行学习,而每一个知识点都对应一个难度值.杨老师希望,后学习的知识点的难度一定不低于前一个知识点的难度(i<j时ai<=aj),而可能存在一个临界点,在临界点以后,他希望后学习的知识点的难度一定不高于前一个知识点的难度(i<j时ai>=aj).杨老师想尽可能多的学习知识.请问:杨老师最多可以学习多少知识

互评Alpha版本——杨老师粉丝群——Pinball

一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 成语学习对除汉语言专业外的大学生的需求并不是很高,初中生和高中生因为在升学时需要参加语文科目考试,虽然有一定的需求但是在课堂上的学习量就已足够.儿童和小学生对成语学习的需求是最大的,我国正在大力进行基础教育课程改革,并且包括成语在内的国学也越来越受到重视.而<Pinball>项目主要目标即是儿童,因此我认为这个选题准确的. (2)A(Approach,做法) <弹球学成语>

Final版本互评——杨老师粉丝群《PinBall》

基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 随着民族自信的觉醒,民主文化越来越受到重视,语文在高考中的比重也不断增加,在这种大环境下,成语的学习变得尤其重要. (2)A(Approach,做法) <Pinball>选用python语言中的pygame模块进行开发,<Pinball>将游戏和学习有机结合了起来,在动感十足的弹球游戏中学习成语,可以说是完美践行了"在学中玩". (3)B(Benefit,

观看杨老师(杨旭)Asp.Net Core MVC入门教程记录

观看杨老师(杨旭)Asp.Net Core MVC入门教程记录 ASP.NET Core MVC入门 Asp.Net Core启动和配置 Program类,Main方法 Startup类 依赖注入,IoC容器 生命周期 Transient:每次被请求都会创建新的实例 Scoped:每次Web请求会创建一个实例 Singleton:一旦被创建实例,就会一直使用这个实例,直到应用停止 依赖注入好处 不用去管生命周期 类型之间没有依赖 补充: ILogger:在Microsoft.Extensions

杨老师课堂由杨亦涛主讲

杨老师课堂由杨亦涛主讲,他是资深网站工程师和UI设计讲师,10年网站开发与教学经验,上百个网站项目成功案例. 擅长技术:UI界面视觉.UI界面交互.网站设计及开发. 曾担任高级网站工程师,主持各种大型网站设计与开发,主攻UI界面视觉.UI界面交互. 曾就职大业工业设计公司.四川九洲电子集团等知名企业. 曾自主创建亦涛工作室,专门从事网站建设.软件开发等业务. 原文地址:https://www.cnblogs.com/yangsir0576/p/10712432.html

POJ 3187 杨辉三角+枚举排列 好题

如果给出一个由1~n组成的序列,我们可以每相邻2个数求和,得到一个新的序列,不断重复,最后得到一个数sum, 现在输入n,sum,要求输出一个这样的排列,如果有多种情况,输出字典序最小的那一个. 刚开始我是直接搜,tle了 然后就开始找最初的序列和最终的和有什么关系 因为最终的和sum一定是等于若干个a[1],若干个a[2],...,若干个a[n]的和 即sum=p1*a1+p2*a2+...+pn*an 所以我们只要求出数组a的系数,n个p即可. 然后发现,和杨辉三角有很大的关系. 如果杨辉三

杨老师课堂之ArrayList集合常用方法解析

ArrayList集合常用方法的解析 1.概述 ? 在前面我们学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变.例如,要保存一个学校的学生,由于不停有新生来报道,同时也有学生毕业离开学校,这时学生的数目很难确定.为了保存这些数目不确定的元素,JDK中提供了一系列特殊的类,这些类可以存储任意类型的元素,并且长度可变,统称为集合.在这里,我们先介绍ArrayList集合,其他集合在后续课程中学习. ? ArrayList集合是程序

杨老师课堂之springAOP事务控制源码解析

spring AOP基于动态代理实现,想看懂源码必须了解动态代理和字节码增强方面的知识. 基于对spring各种配置的了解,首先我们先从DataSourse由谁来管理入手.了解AOP. 一般来讲首先会配置一个datasource,至于你配置什么连接池还是用JNDI这里就不提到细节,总之我们认为配置的spring的全局名称为dataSource就可以了. 接下来会将datasource交给各种连接池的操作类,如:ibatis.jdbcTemplate等等,这些不是我们关心的重点,我们需要关心的是d