[POJ2279] Mr.Young's Picture Permutations

歪解:爆空间的DP

//Writer:jr HSZ;%%%WJMZBMR
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define reg register int
#define f(i,a,b) for(reg i=a;i<=b;i++)
using namespace std;
int n,sum;
int a[6];
LL f[31][31][31][31][31];
int main() {
    while(~scanf("%d",&n)) {
        sum=0;
        if(!n)return 0;
        memset(f,0,sizeof f);
        memset(a,0,sizeof a);
        for(int i=1; i<=n; i++) {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        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((a2 < a1) &&(a2 < a[2]))
                                f[a1][a2+1][a3][a4][a5] += f[a1][a2][a3][a4][a5];
                            if((a3 < a2) && (a3 < a1) && (a3<a[3]))
                                f[a1][a2][a3+1][a4][a5] += f[a1][a2][a3][a4][a5];
                            if((a4 < a3) && (a4 < a2) && (a4 < a1) && (a4<a[4]))
                                f[a1][a2][a3][a4+1][a5] += f[a1][a2][a3][a4][a5];
                            if((a5 < a4) && (a5 < a3) && (a5 < a2) && (a5 < a1) && (a5<a[5]))
                                f[a1][a2][a3][a4][a5+1] += f[a1][a2][a3][a4][a5];
                        }
                    }
                }
            }
        }
        cout << f[a[1]][a[2]][a[3]][a[4]][a[5]] << endl;
    }

正解:杨氏矩阵+勾长公式
证明:https://blog.csdn.net/acdreamers/article/details/14549077
(让我证明?不存在的)

#include <cstdio>
#include <cstring>
long long n,c[10],a[10][55],sum[55*55<<1],cnt;
long long gcd(unsigned long long a,unsigned long long b) {
    if(!b) return a;
    return gcd(b,a%b);
}
int main() {
    while(~scanf("%lld",&n)&&n) {
        long long cnt=0,x=1,y=1;
        std::memset(sum,0,sizeof sum);
        for(int i=1; i<=n; i++) scanf("%lld",&c[i]);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=c[i]; j++) {
                cnt++;
                for(int k=i+1; k<=n; k++) {
                    if(c[k]>=j) sum[cnt]++;
                    else break;
                }
                sum[cnt]+=c[i]-j+1;
            }
        long long tp;
        for(int i=1; i<=cnt; i++) {
            x*=i;
            y*=sum[i];
            tp=gcd(x,y);
            x/=tp,y/=tp;
        }
        printf("%lld\n",x/y);
    }
}

[POJ2279] Mr.Young's Picture Permutations

原文地址:https://www.cnblogs.com/sdfzhsz/p/9278798.html

时间: 2024-10-30 16:22:39

[POJ2279] Mr.Young's Picture Permutations的相关文章

线性DP POJ2279 Mr.Young&#39;s Picture Permutations

Mr. Young's Picture Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1128   Accepted: 562 Description Mr. Young wishes to take a picture of his class. The students will stand in rows with each row no longer than the row behin

poj2279 Mr. Young&#39;s Picture Permutations[勾长公式 or 线性DP]

若干人左对齐站成最多5行,给定每行站多少个,列数从第一排开始往后递减.要求身高从每排从左到右递增(我将题意篡改了便于理解233),每列从前向后递增.每个人身高为1...n(n<=30)中的一个数(互不不同).求可行方案数.(地址点我qwq): 做了lyd书dp这一章的第一题,就不会qwq..果然菜的人还是永远菜啊,注定翻不了身. lyd的书上讲到了dp的方法,不是很理解.后来想通了,发现自己想的时候也想到了这一点转化,但是又很快把他抛弃掉了..冏. 上面所谓的转化就是说,我本来安排人去排列,是无

【题解】POJ2279 Mr.Young′s Picture Permutations dp

[题解]POJ2279 Mr.Young′s Picture Permutations dp 钦定从小往大放,然后直接dp. \(dp(t1,t2,t3,t4,t5)\)代表每一行多少人,判断边界就能dp. 然后你发现\(30^5\)开不下,但是你仔细观察由于它保证\(\sum < 30\)所以你只用开\(30^5 \div 5!\)就好了. 具体为什么我相信你会 //@winlere #include<iostream> #include<cstring> #include

【杨氏矩阵+勾长公式】POJ 2279 Mr. Young&#39;s Picture Permutations

Description Mr. Young wishes to take a picture of his class. The students will stand in rows with each row no longer than the row behind it and the left ends of the rows aligned. For instance, 12 students could be arranged in rows (from back to front

SP15637 GNYR04H - Mr Youngs Picture Permutations

传送门 Description 杨先生希望为他的班级拍照.学生将排成一行,每行不超过后面的行,并且行的左端对齐.例如,可以安排12名学生排列(从后到前)5,3,3和1名学生. X X X X X X X X X X X X 此外,杨先生希望每排学生安排高度从左到右减少.此外,学生身高应从后向前减少.想想看,杨先生看到,对于这个12人的例子,至少有两种安排学生的方式(数字代表高度,其中1代表最高): 1 2 3 4 5 1 5 8 11 12 6 7 8 2 6 9 9 10 11 3 7 10

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

DP题目列表/弟屁专题

声明: 1.这份列表不是我原创的,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 195

[转] POJ DP问题

列表一:经典题目题号:容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740, 1742, 1887, 1926, 1936, 1952, 1953, 1958, 1959, 1962, 1975, 1989, 2018, 2029, 2039, 2063, 20

.net excel 导入 导出

哎,好好的代码今天说来个实验,结果用的是office15 气死人了,网上最高office14.dll 文章转自2012年 QQ群:13615607 MR.Young 1 private DataSet loadSouce(string path) 2 { 3 4 5 //连接EXCEL数据源 6 //string strPath = this.getPath(); 7 //string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source