Reconstrucción del lenguaje C [935] Marcador Knight

Código fuente para todos los temas: dirección de Git

tema

国际象棋中的骑士可以按下图所示进行移动:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

这一次,我们将 “骑士” 放在电话拨号盘的任意数字键(如上图所示)上,接下来,骑士将会跳 N-1 步。每一步必须是从一个数字键跳到另一个数字键。

每当它落在一个键上(包括骑士的初始位置),都会拨出键所对应的数字,总共按下 N 位数字。

你能用这种方式拨出多少个不同的号码?

因为答案可能很大,所以输出答案模 10^9 + 7。

 

示例 1:

输入:1
输出:10
示例 2:

输入:2
输出:20
示例 3:

输入:3
输出:46
 

提示:
1 <= N <= 5000

Programa:

  • dp, solo sigue los requisitos del tema
class Solution
{
    
    
public:
    int knightDialer(int n)
    {
    
    
        if (n == 1)
            return 10;
        int sum = 0;
        int mod = 1e9+7;
        vector<vector<long>> dp(n, vector<long>(10, 0));
        //数组初始化
        for (int i = 0; i < 10; i++)
        {
    
    
            dp[0][i] = 1;
        }
        //1=6、8
        //2=7、9
        //3=4、8
        //4=3、9、0
        //5=不可能跳到,不用考虑
        //6=1、7、0
        //7=2、6
        //8=1、3
        //9=2、4
        //0=4、6
        for (int i = 1; i < n; i++)
        {
    
    
            dp[i][0] += (dp[i - 1][4]+dp[i - 1][6])%mod;
            dp[i][1] += (dp[i - 1][6]+dp[i - 1][8])%mod;
            dp[i][2] += (dp[i - 1][7]+dp[i - 1][9])%mod;
            dp[i][3] += (dp[i - 1][4]+dp[i - 1][8])%mod;
            dp[i][4] += (dp[i - 1][3]+dp[i - 1][9]+dp[i - 1][0])%mod;
            //5忽略
            dp[i][6] += (dp[i - 1][1]+dp[i - 1][7]+dp[i - 1][0])%mod;
            dp[i][7] += (dp[i - 1][2]+dp[i - 1][6])%mod;
            dp[i][8] += (dp[i - 1][1]+dp[i - 1][3])%mod;
            dp[i][9] += (dp[i - 1][2]+dp[i - 1][4])%mod;
        }
        for (int i = 0; i < 10; i++)
        {
    
    
            sum = (sum+dp[n - 1][i])%mod;
        }
        return sum;
    }
};
Cálculo de complejidad
  • Complejidad del tiempo: O (n)
  • Complejidad espacial: O (n)

Supongo que te gusta

Origin blog.csdn.net/symuamua/article/details/114769013
Recomendado
Clasificación