【题解】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<cstdio>
using namespace std;  typedef long long ll;

const int maxn=35;
unsigned int dp[maxn][maxn/2+1][maxn/3+1][maxn/4+1][maxn/5+1];
int l[7];

int main(){
      int n;
      while(cin>>n,n){
        memset(dp,0,sizeof dp);
        memset(l,0,sizeof l);
        for(register int t=1;t<=n;++t)
          cin>>l[t];
        dp[0][0][0][0][0]=1;
        for(register int t1=1;t1<=l[1];++t1){
          for(register int t2=0;t2<=min(l[2],t1);++t2){
            for(register int t3=0;t3<=min(l[3],t2);++t3){
                  for(register int t4=0;t4<=min(l[4],t3);++t4){
                    for(register int t5=0;t5<=min(l[5],t4);++t5){
                      unsigned int&k=dp[t1][t2][t3][t4][t5];
                      if(t5)k+=dp[t1][t2][t3][t4][t5-1];
                      if(t4-1>=t5)k+=dp[t1][t2][t3][t4-1][t5];
                      if(t3-1>=t4)k+=dp[t1][t2][t3-1][t4][t5];
                      if(t2-1>=t3)k+=dp[t1][t2-1][t3][t4][t5];
                      if(t1-1>=t2)k+=dp[t1-1][t2][t3][t4][t5];

                    }
                  }
            }
          }
        }
        cout<<dp[l[1]][l[2]][l[3]][l[4]][l[5]]<<'\n';
      }
      return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/10861827.html

时间: 2024-09-29 23:43:26

【题解】POJ2279 Mr.Young′s Picture Permutations dp的相关文章

线性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&#39;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]

【杨氏矩阵+勾长公式】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 2411【题解】Mondriaan&#39;s Dream 状压DP

题目链接:http://poj.org/problem?id=2411 把每一行当作一个二进制状态. 1表示是一个竖着的1*2的方格. 0表示其他状态. 那么显然当i-1的状态k能转移到i的j: 1.j 和 k 的按位与为0.(有1必须要0,0也可以有1) 2.j 和 k 按位或每一段0都有偶数个.(表示横着的长方形) 那么就可以预处理一下合格的点. 然后状压DP. 代码如下: #include<cstdio> using namespace std; int n,m; long long f

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

UVA 11077 Find the Permutations DP

Find the Permutations Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem D Find the Permutations Input: Standard Input Output: Standard Output Sorting is one of the most used operations in real lif

codeforces 505C - Mr. Kitayuta, the Treasure Hunter(dp)

题意 一共有30000个位置,从第0个位置开始走,第一次走k步,对于每一次走步,可以走上一次的ki+1 ,ki ,ki-1步数(必须大于等于1),每个岛上有value,求最大能得到的value能有多少. 分析 一开始我想用搜索做,然后一直会T,看了题解才知道是用dp来做,感觉最后自己还是写的挺搓的_(:з」∠)_. 首先可以证明出每一步的步数与第一次的步数差值不会超过250. 开一个二维dp数组,dp[i][j]代表在第i个位置,前一步走了(j-250+k)步数 所以dp转移方程为 if(j-2