圆环上有 10 个点,编号 0~9 。从 0 出发,每次可以顺时针或逆时针走一格,请问一共走且仅走 n 步回到原点的方法有多少种。
数据范围:
,由于答案可能会非常大,所以请对答案对
取模
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
private static final int MOD = 1000000007;
public int circle (int n) {
// dp[i][j]表示走i步到达点编号j的方法种数
int[][] dp = new int[n + 1][10];
dp[0][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 9; j++) {
dp[i][j] = (dp[i - 1][(j - 1 + 10) % 10] + dp[i - 1][(j + 1) % 10]) % MOD;
}
}
return dp[n][0];
}
} //每一个步骤的对应方法为左边编号的方法和右边编号的方法加和
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
int circle(int n) {
// write code here
long long int dp[10][n+1];
int mod = 1000000007;
for(int i=0;i<=9;i++)
{
for(int j=0;j<=n;j++)
{
dp[i][j] = 0;
}
}
dp[0][0] = 1;
for(int m=1;m<=n;m++)
{
for(int i=0;i<=9;i++)
{
dp[i][m] = (dp[(i-1+10)%10][m-1]%mod+dp[(i+1+10)%10][m-1]%mod)%mod;
}
}
//cout<<"dp[0][n] = "<<dp[0][n]<<endl;
return dp[0][n];
}
};