每日一题 day14 打卡

Analysis

五维dp
f[a1,a2,a3,a4,a5]表示各排从左端起分别占了a1,a2,a3,a4,a5个人时合影方案数量
然后我们枚举a1,a2,a3,a4,a5从0开始到N1,N2……N5
若a1 < N1
若a2 < N2&a1 > a2
若a3 < N3&a2 > a3
……(以此类推)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6 #define maxn 30+10
 7 #define maxk 5+10
 8 using namespace std;
 9 inline int read()
10 {
11     int x=0;
12     bool f=1;
13     char c=getchar();
14     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
15     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
16     if(f) return x;
17     return 0-x;
18 }
19 inline void write(int x)
20 {
21     if(x<0){putchar('-');x=-x;}
22     if(x>9)write(x/10);
23     putchar(x%10+'0');
24 }
25 int k;
26 int a[maxk],s[maxk];
27 int dp[maxn][maxn][maxn][maxn][maxn];
28 signed main()
29 {
30     while(1)
31     {
32         memset(dp,0,sizeof(dp));
33         memset(a,0,sizeof(a));
34         k=read();
35         if(k==0) return 0;
36         for(int i=1;i<=k;i++) a[i]=read();
37         dp[0][0][0][0][0]=1;
38         for(s[1]=0;s[1]<=a[1];s[1]++)
39             for(s[2]=0;s[2]<=a[2];s[2]++)
40                 for(s[3]=0;s[3]<=a[3];s[3]++)
41                     for(s[4]=0;s[4]<=a[4];s[4]++)
42                         for(s[5]=0;s[5]<=a[5];s[5]++)
43                             for(int i=1;i<=k;i++)
44                             {
45                                 if(s[i]<a[i]&&(i==1||s[i-1]>s[i]))
46                                 {
47                                     int x1=s[1],x2=s[2],x3=s[3],x4=s[4],x5=s[5];
48                                     s[i]++;
49                                     dp[s[1]][s[2]][s[3]][s[4]][s[5]]+=dp[x1][x2][x3][x4][x5];
50                                     s[i]--;
51                                 }
52                             }
53         write(dp[a[1]][a[2]][a[3]][a[4]][a[5]]);
54         printf("\n");
55     }
56     return 0;
57 }

请各位大佬斧正

01-22 09:24