我在这个网站上发现了一个适用于java的代码:TopCoder/PatternLock/PatternLock.java。 我很难理解代码是如何工作的。
public class PatternLock {
public int solve(int n, int MOD) {
int[][] dp = new int[n+1][n+1];
dp[0][0] = 1;
int[] count = new int[n+1];
for (int i = 0; i < n; ++ i) {
for (int j = 0; j < n; ++ j) {
if (dp[i][j] == 0) continue;
int dt = dp[i][j] << 1;
if (dt >= MOD)
dt -= MOD;
dp[i][j+1] += dt;
if (dp[i][j+1] >= MOD)
dp[i][j+1] -= MOD;
if (j+1 != n) {
dp[i+1][j+1] += (long) dp[i][j] * (n-j) % MOD;
if (dp[i+1][j+1] >= MOD)
dp[i+1][j+1] -= MOD;
} else {
count[i+1] += (long) dp[i][j] * (n-j) % MOD;
if (count[i+1] >= MOD)
count[i+1] -= MOD;
}
}
}
int ret = 0;
for (int i = 1; i <= n; ++ i) {
ret += (long) count[i] * count[i] % MOD;
if (ret >= MOD)
ret -= MOD;
if (i != 1) {
ret += (long) count[i] * count[i-1] % MOD;
if (ret >= MOD)
ret -= MOD;
}
}
ret <<= 1;
if (ret >= MOD)
ret -= MOD;
return ret;
}
实际上有一个名为solve
的方法作为参数:
-- Example 0
1
12345667
2
将n = 1 , MOD = 12345667
和结果与2进行比较。
如果有人可以帮助我,我不明白检查模式是否有效的程序!我明白这个问题可能看起来很基本,有人可以说学习java,但我在理解这段代码的逻辑时遇到了问题!
有什么帮助吗?