# 12593 - D-Lamp
## 題解:
用prefix sum去算每個點的四個方向的總和
一開始我是開四個二維陣列, 但是會MLE, 所以改只用一個
**Note :** answer要減3是因為lamp那點會重複計算到
## Code:
```c=1
#include <stdio.h>
#include <string.h>
#define max(a, b) (a > b ? a : b)
#define N 2500 + 5
int h, w;
int sum[N][N], ans[N][N];
char g[N][N]; // graph
int main(){
scanf("%d%d", &h, &w);
for (int i = 0; i < h; i++)
scanf("%s", g[i]);
// up
for (int i = 0; i < h; i++){
for (int j = 0; j < w; j++){
if(g[i][j] == '.')
sum[i][j] = (i == 0 ? 1 : sum[i - 1][j] + 1);
ans[i][j] += sum[i][j];
}
}
// down
memset(sum, 0, sizeof(sum));
for (int i = h - 1; i >= 0; i--){
for (int j = w - 1; j >= 0; j--){
if(g[i][j] == '.')
sum[i][j] = (i == h - 1 ? 1 : sum[i + 1][j] + 1);
ans[i][j] += sum[i][j];
}
}
// left
memset(sum, 0, sizeof(sum));
for (int i = 0; i < h; i++){
for (int j = 0; j < w; j++){
if(g[i][j] == '.')
sum[i][j] = (j == 0 ? 1 : sum[i][j - 1] + 1);
ans[i][j] += sum[i][j];
}
}
// right
memset(sum, 0, sizeof(sum));
for (int i = h - 1; i >= 0; i--){
for (int j = w - 1; j >= 0; j--){
if(g[i][j] == '.')
sum[i][j] = (j == w - 1 ? 1 : sum[i][j + 1] + 1);
ans[i][j] += sum[i][j];
}
}
int max = 0;
for (int i = 0; i < h; i++){
for (int j = 0; j < w; j++){
ans[i][j] -= 3;
max = max(max, ans[i][j]);
}
}
printf("%d\n", max);
return 0;
}
```
###### tags: `NTHUOJ`