预处理题目
轰炸敌人
class Solution {
public:
vector<vector<int>>dp_up;
vector<vector<int>>dp_down;
vector<vector<int>>dp_left;
vector<vector<int>>dp_right;
void pre_up(vector<vector<char>>& grid,int m,int n){//每个位置上面能炸死的人
dp_up=vector<vector<int>>(m,vector<int>(n,0));
for(int j=0;j<n;++j){
int cnt=grid[0][j]=='E'?1:0;//敌人个数
for(int i=1;i<m;++i){
if(grid[i][j]=='W'){
cnt=0;//出现墙,敌人数归0
}else if(grid[i][j]=='E'){
cnt++;
}else{
dp_up[i][j]=cnt;
}
}
}
}
void pre_down(vector<vector<char>>& grid,int m,int n){//每个位置下面能炸死的人
dp_down=vector<vector<int>>(m,vector<int>(n,0));
for(int j=0;j<n;++j){
int cnt=grid[m-1][j]=='E'?1:0;//敌人个数
for(int i=m-2;i>=0;--i){
if(grid[i][j]=='W'){
cnt=0;//出现墙,敌人数归0
}else if(grid[i][j]=='E'){
cnt++;
}else{
dp_down[i][j]=cnt;
}
}
}
}
void pre_left(vector<vector<char>>& grid,int m,int n){//每个位置下面能炸死的人
dp_left=vector<vector<int>>(m,vector<int>(n,0));
for(int i=0;i<m;++i){
int cnt=grid[i][0]=='E'?1:0;//敌人个数
for(int j=1;j<n;++j){
if(grid[i][j]=='W'){
cnt=0;//出现墙,敌人数归0
}else if(grid[i][j]=='E'){
cnt++;
}else{
dp_left[i][j]=cnt;
}
}
}
}
void pre_right(vector<vector<char>>& grid,int m,int n){//每个位置下面能炸死的人
dp_right=vector<vector<int>>(m,vector<int>(n,0));
for(int i=0;i<m;++i){
int cnt=grid[i][n-1]=='E'?1:0;//敌人个数
for(int j=n-2;j>=0;--j){
if(grid[i][j]=='W'){
cnt=0;//出现墙,敌人数归0
}else if(grid[i][j]=='E'){
cnt++;
}else{
dp_right[i][j]=cnt;
}
}
}
}
int DP(vector<vector<char>>& grid){
int m=grid.size();
int n=grid[0].size();
int res=0;
pre_up(grid,m,n);
pre_down(grid,m,n);
pre_left(grid,m,n);
pre_right(grid,m,n);
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
res=max(res,dp_up[i][j]+dp_down[i][j]+dp_left[i][j]+dp_right[i][j]);
}
}
return res;
}
int maxKilledEnemies(vector<vector<char>>& grid) {
return DP(grid);
}
};
正方形染色
import java.util.Scanner;
public class Main {
public static int process(String s) {
int[] leftG=new int[s.length()];
int[] rightR=new int[s.length()];
int left=0,right=0;
for(int i=0;i<s.length();++i) {
if(s.charAt(i)=='G') {
leftG[i]=++left;
}else leftG[i]=left;
}
for(int i=s.length()-1;i>=0;--i) {
if(s.charAt(i)=='R') {
rightR[i]=++right;
}else rightR[i]=right;
}
int ans=Integer.MAX_VALUE;
for(int i=0;i<=s.length();++i) {
// System.out.print((i-1>=0?leftG[i-1]:0)+rightR[i]+" ");
ans=Math.min(ans, (i-1>=0?leftG[i-1]:0)+(i==s.length()?0:rightR[i]));
}
return ans;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String s=scan.nextLine();
System.out.println(process(s));
}
}
边框全1最大正方形大小
import java.util.Scanner;
public class Main {
public static int process(int[][] arr,int n) {
int ans=0;
int[][] down=new int[n][n];
for(int col=0;col<n;++col) {
down[n-1][col]=arr[n-1][col];
}
for(int i=n-2;i>=0;--i) {
for(int j=0;j<n;++j) {
if(arr[i][j]==1)down[i][j]=down[i+1][j]+arr[i][j];
}
}
int[][] right=new int[n][n];
for(int row=0;row<n;++row) {
right[row][n-1]=arr[row][n-1];
}
for(int j=n-2;j>=0;--j) {
for(int i=0;i<n;++i) {
if(arr[i][j]==1)right[i][j]=arr[i][j]+right[i][j+1];
}
}
for(int row=0;row<n;++row) {
for(int col=0;col<n;++col) {
for(int a=n;a>0;--a) {
if(row+a-1<n&&col+a-1<n) {//没有越界
if(right[row][col]>=a&&down[row][col]>=a&&
right[row+a-1][col]>=a&&down[row][col+a-1]>=a) {
ans=Math.max(ans, a);
break;
}
}
}
}
}
return ans;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int[][] arr=new int[n][n];
for(int i=0;i<n;++i) {
for(int j=0;j<n;++j) {
arr[i][j]=scan.nextInt();
}
}
System.out.println(process(arr,n));
}
}