Bomb Enemy
非常明显的记忆化搜索,核心问题只有一个:
给定一行/列,如何最高效地计算出每个位置在当前 行/列 上能炸到的最大值。
跑了个简单 Case,结论是,雷可以穿人。和炸弹人差不多。。。
这个题写了两遍还是没能一次写出来, 一次没有分析到正确的点上, 写出来的代码不简洁, 正确的分析方式是
rowCache在第一列(j=0)或W的时候更新
colCache在第一行(i=0)或W的时候更新
剩下情况, 只要"吃老本", 用计算好的rowCache和colCache更新结果就可以.
考虑到循环是 row , col 的顺序,我们的 rowCache 一个变量就够了,但是 colCache 得存个数组才行。
public int maxKilledEnemies(char[][] grid) {
if(grid == null || grid.length == 0) return 0;
int rows = grid.length;
int cols = grid[0].length;
int max = 0;
int rowCache = 0;
int[] colCache = new int[cols];
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
if(j == 0 || grid[i][j - 1] == 'W'){
rowCache = 0;
for(int k = j; k < cols && grid[i][k] != 'W'; k++){
rowCache += grid[i][k] == 'E' ? 1 : 0;
}
}
if(i == 0 || grid[i - 1][j] == 'W'){
colCache[j] = 0;
for(int k = i; k < rows && grid[k][j] != 'W'; k++){
colCache[j] += grid[k][j] == 'E' ? 1 : 0;
}
}
if(grid[i][j] == '0') max = Math.max(max, rowCache + colCache[j]);
}
}
return max;
}