zoukankan      html  css  js  c++  java
  • 激光炸弹【模拟】

    题目大意:

    给出一个5000×5000的矩阵,每个格子上都有权值,求用一个n×n的框最多能框住多少?


    思路;

    考虑二位维前缀和,设s[i][j]为以(1,1)为左上角,(i,j)为右下角的矩阵的和。那么根据容斥原理,易得:

    s[i][j]=s[i1][j]+s[i][j1]s[i1][j1]+a[i][j]

    那么再枚举正方形的右下角求出每个矩阵的答案,再取最大值即可。
    ans=max(s[i][j]s[im][j]s[i][jm]+s[im][jm])


    代码:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    
    int n,m,s[5011][5011],x,y,lenn,lenm,ans;
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            scanf("%d",&s[x+1][y+1]);
        }
        for (int i=1;i<=5001;i++)
         for (int j=1;j<=5001;j++)
          s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];  //二维前缀和
        for (int i=m;i<=5001;i++)
         for (int j=m;j<=5001;j++)
          ans=max(ans,s[i][j]-s[i-m][j]-s[i][j-m]+s[i-m][j-m]);
        printf("%d\n",ans);
        return 0;
    }
  • 相关阅读:
    感知机学习笔记
    NOIP 模拟19
    NOIP 模拟17
    NOIP模拟14-16
    「动态规划」-数位dp专题
    8.5 NOIP 模拟测试 13
    8.3 NOIP 模拟12题解
    8.3 NOIP CE反思
    「分治」-cdq分治
    8.1 NOIP模拟11
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998779.html
Copyright © 2011-2022 走看看