算法1
看了半天大佬们的做法,自己背了一遍。
ee
dd
cccc
bbbbbb
aaaaaaaa
这个状态的结果,要去他前面的状态,来求得。
e
dd
cccc
bbbbbb
aaaaaaaa 可以
ee
d
cccc
bbbbbb
aaaaaaaa 不可以
ee
dd
ccc
bbbbbb
aaaaaaaa 可以
ee
dd
cccc
bbbbb
aaaaaaaa 可以
ee
dd
cccc
bbbbbb
aaaaaaa 可以
blablabla
时间复杂度
参考文献
C++ 代码
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
using ll = long long;
const int maxn = 31;
int main()
{
int k;
while(cin>>k,k)
{
int arr[5] = {0};
for(int i = 0;i < k;++i)scanf("%d",&arr[i]);
ll dp[maxn][maxn][maxn][maxn][maxn];
memset(dp,0,sizeof(dp));
dp[0][0][0][0][0] = 1;
ll &ans = dp[arr[0]][arr[1]][arr[2]][arr[3]][arr[4]];
for(int a = 0;a <= arr[0];++a)
{
for(int b = 0;b <= min(arr[1],a);++b)
{
for(int c = 0;c <= min(arr[2],b);++c)
{
for(int d = 0;d <= min(arr[3],c);++d)
{
for(int e = 0;e <= min(arr[4],d);++e)
{
ll x = dp[a][b][c][d][e];
// printf("x is %lld\n",x);
if(a > b)x += dp[a-1][b][c][d][e];
if(b > c)x += dp[a][b-1][c][d][e];
if(c > d)x += dp[a][b][c-1][d][e];
if(d > e)x += dp[a][b][c][d-1][e];
// printf("now e-1 is %d\n",e-1);
if(e > 0)x += dp[a][b][c][d][e-1];
//
// printf("e is %d and d is %d and ans is %lld\n",e,d,ans);
dp[a][b][c][d][e] = x;
}
}
}
}
}
printf("%lld\n",dp[arr[0]][arr[1]][arr[2]][arr[3]][arr[4]]);
}
return 0;
}