271. 杨老师的照相排列

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[32][32][32][32][32],n,k[5];
//枚举最后一个编号最大的同学的位置,DP代表着abcde及这么多个人的总数,那么a-1bcde的总数也可求得
ll DP(int a,int b,int c,int d,int e){
    if(dp[a][b][c][d][e]!=0)
        return dp[a][b][c][d][e];
    ll s=0;
    if(a>0&&a>b) s+=DP(a-1,b,c,d,e);
    if(b>0&&b>c) s+=DP(a,b-1,c,d,e);
    if(c>0&&c>d) s+=DP(a,b,c-1,d,e);
    if(d>0&&d>e) s+=DP(a,b,c,d-1,e);
    if(e>0) s+=DP(a,b,c,d,e-1);
    dp[a][b][c][d][e]=s;
    return s;
}
int main() {
    while (cin>>n&&n!=0){
        memset(dp,0,sizeof(dp));
        memset(k,0,sizeof(k));
        dp[1][0][0][0][0]=1;
        for(int i=0;i<n;i++) cin>>k[i];
        cout<<DP(k[0],k[1],k[2],k[3],k[4])<<endl;
    }
    return 0;
}

 

posted @ 2020-06-06 20:41  西伯利亚挖土豆  阅读(137)  评论(0编辑  收藏  举报