Linda secuencia
Descripción
Contando patos como secuencias, piensa que la siguiente secuencia es linda
1: Los elementos en la secuencia son mayores o iguales que \ (0 \) y menores o iguales que \ (40 \)
2: cada elemento en la secuencia no es mayor que el promedio de los números anteriores
3: no hay tres números decrecientes consecutivos
Hay una secuencia \ (a (−1≤a_i≤40-1) \)
Puede cambiar \ (-1 \) a cualquier número entero y descubrir cuántas secuencias lindas diferentes puede convertirse la secuencia \ (a \) . La respuesta es módulo \ (10 ^ 9 + 7 \)
De entrada
Ingrese un número entero en la primera línea \ (n \)
Ingrese \ (n \) enteros en la segunda línea
Salida
Salida de un entero
Rango de datos
100% de datos: \ (n ≤ 40 \)
Solución
Lindo tu caballo.
Establezca \ (dp [i] [j] [0/1] [k] \) para seleccionar \ (i \) y \ (j \) para \ (i \) , si este bit es Menos que el anterior, la suma de los números seleccionados
La ecuación de transferencia es obvia.
#include<bits/stdc++.h>
using namespace std;
#define long long int
const int mod=1e9+7;
int n;
int a[50];
int dp[50][50][2][1610];
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
if(a[1]!=-1){
dp[1][a[1]][0][a[1]]=1;
}
else {
for(int i=0;i<=40;++i){
dp[1][i][0][i]=1;
}
}
for(int i=2;i<=n;++i){
if(a[i]!=-1){
for(int j=a[i]*(i-1);j<=1600-a[i];++j){
for(int k=0;k<=a[i];++k){
dp[i][a[i]][0][j+a[i]]+=dp[i-1][k][0][j];
dp[i][a[i]][0][j+a[i]]%=mod;
dp[i][a[i]][0][j+a[i]]+=dp[i-1][k][1][j];
dp[i][a[i]][0][j+a[i]]%=mod;
}
for(int k=a[i]+1;k<=40;++k){
dp[i][a[i]][1][j+a[i]]+=dp[i-1][k][0][j];
dp[i][a[i]][1][j+a[i]]%=mod;
}
}
}
else {
for(a[i]=0;a[i]<=40;++a[i]){
for(int j=a[i]*(i-1);j<=1600-a[i];++j){
for(int k=0;k<=a[i];++k){
dp[i][a[i]][0][j+a[i]]+=dp[i-1][k][0][j];
dp[i][a[i]][0][j+a[i]]%=mod;
dp[i][a[i]][0][j+a[i]]+=dp[i-1][k][1][j];
dp[i][a[i]][0][j+a[i]]%=mod;
}
for(int k=a[i]+1;k<=40;++k){
dp[i][a[i]][1][j+a[i]]+=dp[i-1][k][0][j];
dp[i][a[i]][1][j+a[i]]%=mod;
}
}
}
}
}
int ans=0;
for(int i=0;i<=40;++i){
for(int j=0;j<=40*n;++j){
ans+=dp[n][i][0][j];
ans%=mod;
ans+=dp[n][i][1][j];
ans%=mod;
}
}
printf("%lld\n",ans);
}