预处理题目


轰炸敌人

在这里插入图片描述
在这里插入图片描述

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));
	}

}

在这里插入图片描述



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值