Secuencia fluctuante de C ++ (programación dinámica)

Observe esta secuencia:
1 3 0 2 -1 1 -2…
El último elemento de esta secuencia siempre aumenta en 2 o disminuye en 3 que el elemento anterior, y cada elemento es un número entero.
Dongdong siente mucha curiosidad por este tipo de sucesiones, quiere saber cuántas sucesiones enteras son posibles con longitud nys y este último término siempre aumenta a o disminuye b que el término anterior.
El formato de entrada es
una línea, que contiene cuatro números enteros n, s, a, b, y el significado es como se describe arriba.
El formato de salida es
una línea y contiene un número entero, que indica el número de esquemas que cumplen las condiciones.
Dado que este número es muy grande, genere el resto del número de soluciones dividido por 100000007.
Rango de datos
1≤n≤1000, −109≤s≤109,1≤a, b≤106
Muestra de entrada:
4 10 2 3
Muestra de salida:
2
Explicación de muestra
Dos secuencias de números que cumplen las condiciones son 2 4 1 3 Y 7 4 1-2.

Este es un problema de combinación, pero puede malinterpretarse fácilmente como un problema de secuencia.
Código AC:

#include<stdio.h>

const int Mod=100000007; 

int n,s,a,b;
int f[1010][1010];

int get_mod(int a,int b)//求a%b正余数,防止访问负数下标
{
    
    
    return (a%b+b)%b;
}

int main()
{
    
    
    scanf("%d%d%d%d",&n,&s,&a,&b);
    
    f[0][0]=1;
    for(int i=1;i<n;++i)
        for(int j=0;j<n;++j)
        	//第i项是+a或-b且%n余数为j
        	//可划分为前i-1项%n余数为j-a*i或j-b*i
           f[i][j]=(f[i-1][get_mod(j-a*i,n)]+f[i-1][get_mod(j+b*i,n)])%Mod; 
    printf("%d",f[n-1][get_mod(s,n)]);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108852180
Recomendado
Clasificación