四维动态规划F[a][b][c][d]画一个包含出口的矩形,用来表示哪里已经被访问过了,顺带能表示那些机器人已经被续了
主动递推往四个方向加一行/一列,把活着的机器人统计了就好
#include <bits/stdc++.h>
#define N 101
unsigned short F[N][N][N][N],mp[N][N],sum[N][N];
using namespace std;
inline int rd() { int r; scanf("%d",&r); return r; }
int n,m,sx,sy;
char s[N];
inline void ut(unsigned short &x,unsigned short y) { x = max(x, y); }
void init() {
n = rd(), m = rd();
for (int i=1;i<=n;i++) {
scanf("%s",s+1);
for (int j=1;j<=m;j++) {
s[j] == 'E' ? sx=i, sy=j :0;
s[j] == 'o' ? mp[i][j]=1 :0;
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + mp[i][j];
}
}
}
inline short get(int x1, int y1, int x2, int y2) {
if (x1 > x2 || y1 > y2) return 0;
return sum[x2][y2] - sum[x1][y2] - sum[x2][y1] + sum[x1][y1];
}
void dp(int i, int j, int x, int y) {
unsigned short v = 0;
v = i+x+1 <= sx-1 ?
get(sx-i-2, max(sy-j-1, y), sx-i-1, min(sy+y, m-j)) :0;
ut( F[i+1][j][x][y], F[i][j][x][y] + v );
v = i+x+1 <= n-sx ?
get(sx+x, max(sy-j-1, y), sx+x+1, min(sy+y, m-j)) :0;
ut( F[i][j][x+1][y], F[i][j][x][y] + v );
v = j+y+1 <= sy-1 ?
get(max(sx-i-1, x), sy-j-2, min(sx+x, n-i), sy-j-1) :0;
ut( F[i][j+1][x][y], F[i][j][x][y] + v );
v = j+y+1 <= m-sy ?
get(max(sx-i-1, x), sy+y, min(sx+x, n-i), sy+y+1) :0;
ut( F[i][j][x][y+1], F[i][j][x][y] + v );
return ;
}
void solve() {
unsigned short ans = 0;
for (int i=0;i<=sx-1;i++)
for (int j=0;j<=sy-1;j++)
for (int _i=0;_i<=n-sx;_i++)
for (int _j=0;_j<=m-sy;_j++) {
dp(i,j,_i,_j), ans = max(ans, F[i][j][_i][_j]);
// if (F[i][j][_i][_j] == 1) printf("::1:: %d %d %d %d\n",i,j,_i,_j);
// if (F[i][j][_i][_j] == 2) printf("::2:: %d %d %d %d\n",i,j,_i,_j);
// if (F[i][j][_i][_j] == 3) printf("::3:: %d %d %d %d\n",i,j,_i,_j);
}
printf("%d\n",(int)ans);
}
int main() {
init();
solve();
return 0;
}