【NOIP2011模拟9.7】射命丸文

    xiaoxiao2025-05-31  30

    Description   在幻想乡,射命丸文是以偷拍闻名的鸦天狗。当然,文文的照相机可不止能够照相,还能够消除取景框里面所有的弹幕。假设现在文文面前有一块N行M列的弹幕群,每一个单位面积内有分值有num[i][j]的弹幕。相机的取景框可以将一块R行C列的弹幕消除,并且得到这一块区域内所有弹幕的分值(累加)。现在文文想要取得尽可能多的分值,请你计算出她最多能够得到的分值。 Input   第1行:4个正整数N,M,R,C   第2..N+1行:每行M个正整数,第i+1行第j个数表示num[i][j] Output   第1行:1个整数,表示文文能够取得的最大得分 Sample Input 3 5 2 3 5 2 7 1 1 5 9 5 1 5 3 5 1 5 3 Sample Output 33 Data Constraint Hint 【数据范围】   对于60%的数据:1 <= N,M <= 200   对于100%的数据:1 <= N,M <= 1,000   1 <= R <= N, 1 <= C <= M   1 <= num[i][j] <= 1000   保证结果不超过2,000,000,000

    The Solution

    题目大意 Topic effect

    对于给定的N*M的矩形,在其中找一个R*C的权值最大的区域

    考察算法 Algorithm 模拟 枚举

    我们可以设一个S[i][j]表示以(i,j)为右下角,(1,1)为左上角的区域的权值和, 那么我们以(i,j)为右下角的R*C的区域权值之和的计算公式为:

    F[i,j]=S[i,j]+S[iR,jC]S[iR,j]S[i,jC] 其中S[i][j]计算公式为: S[i,j]=value[i,j]+S[i1,j]+S[i,j1]S[i1,j1] 最后取max

    Code

    #include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <cstring> #define fo(i,a,b) for (int i=a;i<=b;i++) #define fd(i,a,b) for (int i=a;i>=b;i--) #define N 1005 using namespace std; int a[N][N]; int main() { int n,m,r,c; scanf("%d%d%d%d",&n,&m,&r,&c); fo(i,1,n) fo(j,1,m) { scanf("%d",&a[i][j]); a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1]; } int ans=0,Max=0; fo(i,r,n) fo(j,c,m) ans=a[i][j]-a[i-r][j]-a[i][j-c]+a[i-r][j-c],Max=max(Max,ans); printf("%d\n",Max); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1299460.html
    最新回复(0)