LeetCode 第 224 场周赛

刷题


5653. 可以形成最大正方形的矩形数目

比较水,简单模拟,不讲了。


5243. 同积元组

哈希记录乘积结果,每个乘积的贡献是: 4 × c n t × ( c n t − 1 ) 4\times cnt\times (cnt-1) 4×cnt×(cnt1)

怎么来的,从 c n t cnt cnt中选 2 2 2对: c n t ( c n t − 1 ) 2 \dfrac{cnt(cnt-1)}{2} 2cnt(cnt1)两队共有 8 = A 2 2 2 2 = 8 8=A_2^2 2^2=8 8=A2222=8种情况


5655. 重新排列后的最大子矩阵

这一题学到了,贪心排序。

先枚举答案子矩形的底部行。

然后我们要预处理出对于当前行的每一列向上的最大1个数,这个可以通过 d p dp dp求出来。

因为列可以交换,所以对列排序,每次取最值 a n s = m a x ( a n s , b [ j ] × ( w − j ) ) ans=max(ans,b[j]\times (w-j)) ans=max(ans,b[j]×(wj))

因为后面的1个数大于等一前面的1个数,所以从该位置开始往后肯定可以组成一个矩形。

代码

class Solution {
public:
    int largestSubmatrix(vector<vector<int>>& a) {
        int h=a.size(),w=a[0].size();
        vector<vector<int> >up(h,vector<int>(w,0));
        for(int i=0;i<h;i++){
            for(int j=0;j<w;j++){
                if(a[i][j]){
                    up[i][j]=((!i)?0:up[i-1][j])+1;
                }
            }
        }
        int ans=0;
        for(int i=0;i<h;i++){
            vector<int>b;
            for(int j=0;j<w;j++) b.push_back(up[i][j]);
            sort(b.begin(),b.end());
            for(int j=0;j<w;j++)
              ans=max(ans,b[j]*(w-j));
        }
        return ans;   
    }
};

5529. 猫和老鼠 II

这题不会,看了yxc的讲解看懂了,实质是记忆化搜素。

搜索的时候需要记录老鼠和猫的位置和当前是第几轮。

注意轮数大于几百就可以返回猫赢了,不需要返回1000,不然会超时。

int f[8][8][8][8][200];
class Solution {
public:
    int n,m,cj,mj;
    vector<string>g;
    int dx[4]={0,0,1,-1};
    int dy[4]={-1,1,0,0};
    int dfs(int cx,int cy,int mx,int my,int k){
        if(k>=100) return 0;
        auto &v=f[cx][cy][mx][my][k];
        if(~v) return v;

        if(k&1){
            for(int i=0;i<4;i++)
                for(int j=0;j<=cj;j++){
                    int x=cx+dx[i]*j,y=cy+dy[i]*j;
                    if(x<0||x>=n||y<0||y>=m||g[x][y]=='#') break;
                    if(g[x][y]=='F') return v=0;
                    if(x==mx&&y==my) return v=0;
                    if(!dfs(x,y,mx,my,k+1)) return v=0;
                }
            return v=1;
        }
        else {
            for(int i=0;i<4;i++)
                for(int j=0;j<=mj;j++){
                    int x=mx+dx[i]*j,y=my+dy[i]*j;
                    if(x<0||x>=n||y<0||y>=m||g[x][y]=='#') break;
                    if(x==cx&&y==cy) continue;
                    if(g[x][y]=='F') return v=1;
                    if(dfs(cx,cy,x,y,k+1)) return v=1;
                }
            return v=0;
        }
    }
    bool canMouseWin(vector<string>& grid, int catJump, int mouseJump) {
        g=grid;
        n=g.size(),m=g[0].size(),cj=catJump,mj=mouseJump;
        int cx,cy,mx,my;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                if(g[i][j]=='C') cx=i,cy=j;
                else if(g[i][j]=='M') mx=i,my=j;
            }
        memset(f,-1,sizeof f);
        return dfs(cx,cy,mx,my,0);
    }
};