Mr. Young's Picture Permutations

Mr. Youngs Picture Permutations

https://ac.nowcoder.com/acm/problem/106876

图片说明
题目对案例3 2 1解释中,他没有把每个数隔开,注意点就好。

思路:
满足条件的排列是往右往后都是递减的,求所有的排列数。
就像上面图片画的那样,我们对学生的身高降序编号,最高的人编号为,最低的人编号为
那么就是一个简单的填数问题,从依次填入,那么任意时刻每一行中已经填了数一定是从左端开始的连续若干位置(保证往右递减),并且填第行的第列的数时第行的第列必须填了数。
那么线性dp的转移方程已经状态就不难了。
当时滥用爆内存了,居然不是超时。

MyCode:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=1e5+7,maxm=2e5+7,mod=1e9+7;
typedef long long int ll;
typedef unsigned long long ull;
int a[6];
unsigned int f[31][31][31][31][31];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    while(cin>>n,n) {
        for(int i=1; i<=n; ++i) cin>>a[i];
        for(int i=n+1; i<=5; ++i) a[i]=0;
        for(int a5=0; a5<=a[5]; ++a5)
            for(int a4=0; a4<=a[4]; ++a4)
                for(int a3=0; a3<=a[3]; ++a3)
                    for(int a2=0; a2<=a[2]; ++a2)
                        for(int a1=0; a1<=a[1]; ++a1) f[a1][a2][a3][a4][a5]=0;
        f[0][0][0][0][0]=1;
        for(int a5=0; a5<=a[5]; ++a5)
            for(int a4=0; a4<=a[4]; ++a4)
                for(int a3=0; a3<=a[3]; ++a3)
                    for(int a2=0; a2<=a[2]; ++a2)
                        for(int a1=0; a1<=a[1]; ++a1) {
                            if(a1<a[1]) f[a1+1][a2][a3][a4][a5]+=f[a1][a2][a3][a4][a5];
                            if(a1>a2&&a2<a[2]) f[a1][a2+1][a3][a4][a5]+=f[a1][a2][a3][a4][a5];
                            if(a2>a3&&a3<a[3]) f[a1][a2][a3+1][a4][a5]+=f[a1][a2][a3][a4][a5];
                            if(a3>a4&&a4<a[4]) f[a1][a2][a3][a4+1][a5]+=f[a1][a2][a3][a4][a5];
                            if(a4>a5&&a5<a[5]) f[a1][a2][a3][a4][a5+1]+=f[a1][a2][a3][a4][a5];

//                            if(a1==1&&a2==0&&a3==0&&a4==0&&a5==0) cout<<f[1][1][0][0][0]<<'\n';
//                            if(a1==1&&a2==1&&a3==0&&a4==0&&a5==0) cout<<f[1][1][1][0][0]<<'\n';
                        }
        cout<<f[a[1]][a[2]][a[3]][a[4]][a[5]]<<'\n';
    }
}
动态规划入门 文章被收录于专栏

能采用动态规划求解一般要具有3个性质: (1) 最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。 (2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。 (3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(体现DP的优点)

全部评论

相关推荐

11-11 22:08
佛山大学 Java
点赞 评论 收藏
分享
10-31 13:04
南华大学 Java
嵌入式的小白:很多面试,面试前不会去打扰cto的,但一般cto不会在这些小事上刷人,只能说这个cto比较操心,啥重要不重要,紧急不紧急的,估计都会过问,平淡看待吧
点赞 评论 收藏
分享
10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务