1. 程式人生 > >$POJ2279 Mr.Young's Picture Permutations dp$

$POJ2279 Mr.Young's Picture Permutations dp$

com www ida hid clas 滿足 sla 專題 條件

正解:$dp$

解題報告:

傳送門!

先放下題目大意昂$QwQ$,就說給定$N$個人,$K$排,以及每排的人數$a_{1},...,a_{K}$,現要求每排人數遞減,然後每列人數也遞減,求排列方案數

顯然考慮從矮到高考慮,就有一定要是滿足輪廓是個凸的,就長得有點兒像之前寒假考試的搜索專題D2T5(記搜)

這題就差不多套路,考慮五維$dp$:設$f_{d_1,d_2,d_3,d_4,d_5}$,然後判斷$d_1\leqslant d_2$這種之類亂七八糟的條件,然後瞎轉一下,就歐克了

嗷對辣,就是,因為如果直接開$f_{30,30,30,30,30}$會炸空間,,,所以這裏要對著讀入開,,,啊呀說不清楚還是看$code$趴$QwQ$

技術分享圖片
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define il inline
#define gc getchar()
#define int long long
#define ri register int
#define rb register bool
#define
rc register char #define rp(i,x,y) for(ri i=x;i<=y;++i) #define my(i,x,y) for(ri i=x;i>=y;--i) const int M=5+10,N=1e7; int n,as,a[M]; bool gdgs=1; il int read() { rc ch=gc;ri x=0;rb y=1; while(ch!=- && (ch>9 || ch<0))ch=gc; if(ch==-)ch=gc,y=0;
while(ch>=0 && ch<=9)x=(x<<1)+(x<<3)+(ch^0),ch=gc; return y?x:x; } signed main() { while(gdgs) { ri n=read();if(!n)return 0;rp(i,1,n)a[i]=read();rp(i,n+1,5)a[i]=0; int f[a[1]+1][a[2]+1][a[3]+1][a[4]+1][a[5]+1];memset(f,0,sizeof(f));f[0][0][0][0][0]=1; rp(i,1,a[1]) { rp(j,0,min(a[2],i)) { rp(k,0,min(a[3],j)) { rp(p,0,min(a[4],k)) { rp(q,0,min(a[5],p)) { if(q)f[i][j][k][p][q]+=f[i][j][k][p][q-1]; if(p-1>=q)f[i][j][k][p][q]+=f[i][j][k][p-1][q]; if(k-1>=p)f[i][j][k][p][q]+=f[i][j][k-1][p][q]; if(j-1>=k)f[i][j][k][p][q]+=f[i][j-1][k][p][q]; if(i-1>=j)f[i][j][k][p][q]+=f[i-1][j][k][p][q]; } } } } } printf("%lld\n",f[a[1]][a[2]][a[3]][a[4]][a[5]]); } return 0; }
View Code

$POJ2279\ Mr.Young's\ Picture\ Permutations\ dp$