classSolution{public:intmaxKilledEnemies(vector<vector<char>>&grid){constintm=grid.size();constintn=grid[0].size();intenemyCount=0;// dp[i][j] := max enemies grid[i][j] can killvector<vector<int>>dp(m,vector<int>(n));autoupdate=[&](inti,intj){if(grid[i][j]=='0')dp[i][j]+=enemyCount;elseif(grid[i][j]=='E')++enemyCount;else// grid[i][j] == 'W'enemyCount=0;};// Extend four directions, if meet 'W', need to start over from 0for(inti=0;i<m;++i){enemyCount=0;for(intj=0;j<n;++j)update(i,j);enemyCount=0;for(intj=n-1;j>=0;--j)update(i,j);}for(intj=0;j<n;++j){enemyCount=0;for(inti=0;i<m;++i)update(i,j);enemyCount=0;for(inti=m-1;i>=0;--i)update(i,j);}returnaccumulate(begin(dp),end(dp),0,[](ints,vector<int>&row){returnmax(s,*max_element(begin(row),end(row)));});}};
classSolution{publicintmaxKilledEnemies(char[][]grid){if(grid.length==0||grid[0].length==0)return0;finalintm=grid.length;finalintn=grid[0].length;intans=0;// dp[i][j] := max enemies grid[i][j] can killint[][]dp=newint[m][n];// Extend four directions, if meet 'W', need to start over from 0for(inti=0;i<m;++i){enemyCount=0;for(intj=0;j<n;++j)update(grid,i,j,dp);enemyCount=0;for(intj=n-1;j>=0;--j)update(grid,i,j,dp);}for(intj=0;j<n;++j){enemyCount=0;for(inti=0;i<m;++i)update(grid,i,j,dp);enemyCount=0;for(inti=m-1;i>=0;--i)update(grid,i,j,dp);}for(int[]row:dp)ans=Math.max(ans,Arrays.stream(row).max().getAsInt());returnans;}privateintenemyCount=0;privatevoidupdate(char[][]grid,inti,intj,int[][]dp){if(grid[i][j]=='0')dp[i][j]+=enemyCount;elseif(grid[i][j]=='E')++enemyCount;else// grid[i][j] == 'W'enemyCount=0;}}
classSolution:defmaxKilledEnemies(self,grid:List[List[chr]])->int:m=len(grid)n=len(grid[0])enemyCount=0# dp[i][j] := max enemies grid[i][j] can killdp=[[0]*nfor_inrange(m)]defupdate(i:int,j:int)->None:nonlocalenemyCountifgrid[i][j]=='0':dp[i][j]+=enemyCountelifgrid[i][j]=='E':enemyCount+=1else:# grid[i][j] == 'W'enemyCount=0# Extend four directions, if meet 'W', need to start over from 0foriinrange(m):enemyCount=0forjinrange(n):update(i,j)enemyCount=0forjinreversed(range(n)):update(i,j)forjinrange(n):enemyCount=0foriinrange(m):update(i,j)enemyCount=0foriinreversed(range(m)):update(i,j)# Returns sum(map(sum, dp))returnmax(map(max,dp))