⭐⭐201312-4 Números interesantes

Al principio quería usar arreglos, pero no sabía cómo hacer bucles, ¡no esperaba que fuera una programación dinámica!
status[i][j] significa un número interesante cuya longitud es i y cuyo estado es j.
Se sabe que hay cinco estados de un número interesante
. La cadena completa tiene un solo carácter: por el significado de la pregunta, este el carácter solo puede ser 2 y
el estado 0: hay 2
La cadena completa tiene dos caracteres:
Estado 1: hay 2, 0
Estado 2: hay 2, 3; y 3 está detrás de 2
La cadena completa tiene 3 caracteres
Estado 3: Hay 2, 0, 1 y 1 Después de 0
Estado 4: Hay 2, 3, 0 y 3 está detrás de 2
La cadena completa tiene 4 caracteres:
Estado 5: Hay 2, 3, 0, 1 y 3 está detrás de 2, 1 está detrás de 0

Las condiciones iniciales se pueden conocer de la siguiente manera
:

dp[1][0]=1;
dp[1][1]=0;
dp[1][2]=0;
dp[1][3]=0;
dp[1][4]=0;
dp[1][5]=0;

Luego, i itera de 2 a n, y finalmente dp[i][5] es el resultado.La fórmula de iteración es la siguiente:

dp[i][0]=1;//显而易见
//只有2,长度为i-1的字符串在后面加上0
//有2,0,长度为i-1的字符串在后面加上2或则和0,所以要*2
dp[i][1]=dp[i-1][0]+2*dp[i-1][1];
//只有2,长度为i-1的字符串在后面加上3
//有2,3,长度为i-1的字符串,因为2只能在3前面,所以只能在i-1字符串后面加上3
dp[i][2]=dp[i-1][0]+dp[i-1][2];
//只有2、0,长度为i-1的字符串在后面加上1
//有2,0,1,长度为i-1的字符串,面加上2或者1
dp[i][3]=dp[i-1][1]+dp[i-1][3]*2;
//有2,0,长度为i-1的字符串在后面加上3
//有2,3,长度为i-1的字符串在后面加上0
//有2,0,3的字符串在后面加上3或者0
dp[i][4]=dp[i-1][1]+dp[i-1][2]+dp[i-1][4]*2;
//有2、0、1、3的字符串在后面加上1或者3
//和上面一样,类推
//和上面一样,类推
dp[i][5]=dp[i-1][5]*2+dp[i-1][3]+dp[i-1][4];

Porque necesita módulo MOD=1000000007
, por lo que cada cálculo de dp es %MOD

Al mismo tiempo, tenga en cuenta que la matriz dp se abre en long long

/* CCF201312-4 有趣的数 */
 
#include <iostream>
#include <cstring>
 
using namespace std;
 
const long long MOD = 1000000007;
const int MAXN = 1000;
const int MAXS = 5;
long long status[MAXN+1][MAXS+1];
 
 
int main()
{
    
    
    int n;
 
    cin >> n;
 
    memset(status, 0, sizeof(status));
 
    // DP
    status[1][0] = 1;
    for(int i=2; i<=n; i++) {
    
    
        status[i][0] = 1;
        status[i][1] = (status[i - 1][1] * 2 + status[i - 1] [0]) % MOD;
        status[i][2] = (status[i - 1][2] + status[i - 1][0]) % MOD;
        status[i][3] = (status[i - 1][3] * 2 + status[i - 1][1] ) % MOD;
        status[i][4] = (status[i - 1][4] * 2 + status[i - 1][1] + status[i - 1][2]) % MOD;
        status[i][5] = (status[i - 1][5] * 2 + status[i - 1][3] + status[i - 1][4]) % MOD;
    }
 
    cout << status[n][5] << endl;
 
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/susuate/article/details/120218559
Recomendado
Clasificación