• D. White Lines


    D. White Lines

    给定一个$n imes n$的$WB$矩阵,给定一个$k*k$的能把$B$变成$W$的橡皮擦,求橡皮擦作用一次后,全为$W$的行、列总数最大值

    前缀和差分

    #include<bits/stdc++.h>
    using namespace std;
    int A[2004][2004];
    char C[2004][2004];
    int B[2004][2004];
    int E[2004][2004];
    int  F[2004][2004];
    int n,k;
    int main()
    {
        scanf("%d%d",&n,&k);
        int ans=0;
        for(int i=1; i<=n; i++)
        {
            getchar();
            for(int j=1; j<=n; j++)
            {
                C[i][j]=getchar();
                A[i][j]=A[i][j-1]+(C[i][j]=='B');
            }
            if(A[i][n]==0)ans++;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                B[j][i]=B[j-1][i]+(C[j][i]=='B');
            }
            if(B[n][i]==0)ans++;
        }
        //cout<<ans<<'
    ';
        int t=0,ma=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j+k-1<=n;j++){
                E[i][j]=E[i-1][j]+(A[i][j+k-1]-A[i][j-1]==A[i][n]&&A[i][n]);
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j+k-1<=n;j++){
                F[j][i]=F[j][i-1]+(B[j+k-1][i]-B[j-1][i]==B[n][i]&&B[n][i]);
            }
        }
        for(int i=1;i+k-1<=n;i++){
            for(int j=1;j+k-1<=n;j++){
                t=E[i+k-1][j]-E[i-1][j];
                t+=F[i][j+k-1]-F[i][j-1];
                ma=max(t,ma);
            }
    
        }
        cout<<ans+ma<<'
    ';
    
    }
  • 相关阅读:
    360网盘书籍分享
    oracle11g字符集问题之一
    order by 的列名不能参数化,要拼sql
    oracle11g的冷热备份
    Spring 事务管理的使用
    Spring 事务管理的API
    事务总结
    Excel 单元格中内容的换行
    手动配置IP地址
    MyBatis 三剑客
  • 原文地址:https://www.cnblogs.com/liulex/p/11345076.html
Copyright © 2020-2023  润新知