正题
题目链接:http://poj.org/problem?id=2279
题目大意
有k列,每列人数不同,要求从左到右和从前到后身高都单调递减,学生高度是1∼N1∼N(人数总和)
解题思路
我们开一个五维数组,然后每次在人少那列填充,按照这总方法,我们进行dp(公式较长,暂不解释)。
code
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int k,n[6];
int main()
{while(scanf("%d",&k)){if(!k) break;memset(n,0,sizeof(n));for(int i=1;i<=k;i++){scanf("%d",&n[i]);}long long f[n[1]+1][n[2]+1][n[3]+1][n[4]+1][n[5]+1];memset(f,0,sizeof(f));f[0][0][0][0][0]=1;for(int i1=0;i1<=n[1];i1++)for(int i2=0;i2<=n[2];i2++)for(int i3=0;i3<=n[3];i3++)for(int i4=0;i4<=n[4];i4++)for(int i5=0;i5<=n[5];i5++){if(i1<n[1])f[i1+1][i2][i3][i4][i5]+=f[i1][i2][i3][i4][i5];if(i1>i2 && i2<n[2])f[i1][i2+1][i3][i4][i5]+=f[i1][i2][i3][i4][i5];if(i1>i3 && i2>i3 && i3<n[3])f[i1][i2][i3+1][i4][i5]+=f[i1][i2][i3][i4][i5];if(i1>i4 && i2>i4 && i3>i4 && i4<n[4])f[i1][i2][i3][i4+1][i5]+=f[i1][i2][i3][i4][i5];if(i1>i5 && i2>i5 && i3>i5 && i4>i5 && i5<n[5])f[i1][i2][i3][i4][i5+1]+=f[i1][i2][i3][i4][i5];}printf("%lld\n",f[n[1]][n[2]][n[3]][n[4]][n[5]]);}
}