题目链接.
dp[a][b][c][d]:前a个数中以b结尾的是第(c+1)个递减数且和为d的美丽序列的个数。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll mod=1e9+7;
int n;
ll dp[42][42][2][1605];
int a[50];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
if(a[1]==-1)
{
for(int i=0;i<=40;i++)
dp[1][i][0][i]=1;
}
else dp[1][a[1]][0][a[1]]=1;
for(int i=2;i<=n;i++)
{
if(a[i]==-1)
{
for(int x=0;x<=40;x++)
{
for(int j=0;j<=40;j++)
{
for(int k=0;k<=1600;k++)
{
if(x*i<=k)
{
if(x>=j)
{
dp[i][x][0][k]=(dp[i][x][0][k]+dp[i-1][j][0][k-x])%mod;
dp[i][x][0][k]=(dp[i][x][0][k]+dp[i-1][j][1][k-x])%mod;
}
else
{
dp[i][x][1][k]=(dp[i][x][1][k]+dp[i-1][j][0][k-x])%mod;
}
}
}
}
}
}
else
{
int x=a[i];
for(int j=0;j<=40;j++)
{
for(int k=0;k<=1600;k++)
{
if(x*i<=k)
{
if(x>=j)
{
dp[i][x][0][k]=(dp[i][x][0][k]+dp[i-1][j][0][k-x])%mod;
dp[i][x][0][k]=(dp[i][x][0][k]+dp[i-1][j][1][k-x])%mod;
}
else
{
dp[i][x][1][k]=(dp[i][x][1][k]+dp[i-1][j][0][k-x])%mod;
}
}
}
}
}
}
ll ans=0;
for(int i=0;i<=1600;i++)
{
for(int j=0;j<=40;j++)
{
ans=(ans+dp[n][j][0][i]+dp[n][j][1][i])%mod;
}
}
cout<<ans<<"\n";
return 0;
}