$POJ2279 Mr.Young's Picture Permutations dp$
阿新 • • 發佈:2019-05-12
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 #defineView Coderc 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; }
$POJ2279\ Mr.Young's\ Picture\ Permutations\ dp$