gpt4 book ai didi

java - TopCoder FourBlocks 问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:42:37 26 4
gpt4 key购买 nike

下面的代码是一个流行的 topcoder 问题的答案 FourBlocks (您需要登录)。该解决方案使用位掩码内存来使用大小为 1 的 block 和大小为 4 的正方形 block 来查找网格中的最大和。任何人都可以帮助我理解它是如何工作的吗?这是做什么的

int[][] d = new int[m + 1][1 << n] // why 1<<n ? 

另外,函数rec()如何适合正方形?它只比较 2 位。

import java.util.*;
import java.util.regex.*;
import java.text.*;
import java.math.*;


public class FourBlocks
{
int n;

public int maxScore(String[] grid)
{
n = grid.length;
int m = grid[0].length();
int[][] d = new int[m + 1][1 << n];
int ans = 0;
for (int i = 0; i < m; ++i) {
int mask = 0;
for (int j = 0; j < n; ++j) {
if (grid[j].charAt(i) == '1') {
mask |= 1 << j;
}
}
ans += Integer.bitCount(mask);
for (int j = 0; j < 1 << n; ++j) {
if ((j & mask) == 0) {
rec(0, j | mask, 0, d[i][j], d[i + 1]);
}
}
}
return d[m][0] + ans;
}

void rec(int i, int mask, int mask2, int sum, int[] d) {
if (i == n) {
d[mask2] = Math.max(d[mask2], sum);
return;
}
rec(i + 1, mask, mask2, sum, d);
if ((mask & (1 << i)) == 0) {
rec(i + 1, mask, mask2, sum + 1, d);
}
if (i < n - 1 && (mask & (1 << i)) == 0 && (mask & (1 << (i + 1))) == 0) {
rec(i + 2, mask, mask2 | (1 << i) | (1 << (i + 1)), sum + 16, d);
}
}


}

最佳答案

1<<n是用 1 填充一行的方法数的。 (1<<n = 2^n)。看起来他计算了所有可能的方法来用 1 填充棋盘,然后检查有多少个四。为了加快速度,他使用动态编程,将其从行数指数级折叠起来。

关于java - TopCoder FourBlocks 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5000033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com