• HNOI2003 激光炸弹


    题面

    link

    solution

    水题一枚,题目意思是给出n个点,每个点有一个价值,问一个边长为r的点最大能获得多大价值。

    维护一个二维前缀和即可。

    如果我们要求红色部分的和,是不是用整个有颜色部分的正方形的面积S - 黄色 - 绿色 - 蓝色

    那么怎么利用前缀和的知识来求呢。

    二维中,前缀和代表某点相对于矩阵左上角的矩形区域的面积。

    所以可以推出ans = map[5][5]-map[5][5-2-1]-map[2][5-2-1]+map[2][2]这里为什么是5-2-1 呢, 5代表要求的点, 2代表边长

    这道题有一个坑,就是边界上的点不算,所以我们要求边长为R-1的矩形.

    code

    送上AC代码

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<math.h>
     4 using namespace std;
     5 int map[5005][5005]={0};
     6 int main()
     7 {
     8     int N,R;
     9     int x,y,w;
    10     cin>>N>>R;
    11     int n = R,m = R;
    12     for(int i=0;i<N;i++)
    13     {
    14         cin>>x>>y>>w;
    15         x++; y++;
    16         map[x][y]+=w;
    17         n = max(n,x);
    18         m = max(m,y);
    19     }
    20     for(int i=1;i<=n;i++)
    21     {
    22         for(int j=1;j<=m;j++)
    23         {
    24             map[i][j] +=map[i-1][j]+map[i][j-1]-map[i-1][j-1];
    25         }
    26     }
    27     int ans = 0;
    28     for(int i=R;i<=n;i++)
    29     {
    30         for(int j=R;j<=m;j++)
    31         {
    32             int tmp = map[i][j]-map[i-R][j]-map[i][j-R]+map[i-R][j-R];
    33             ans = max(ans,tmp);
    34         }
    35     }
    36     cout<<ans<<endl;
    37  }
  • 相关阅读:
    c/c++:字符串输入输出流
    POJ 1036Gangsters【DP】
    POJ 1157LITTLE SHOP OF FLOWERS【DP】
    一个月后....
    http://poj.org/problem?id=1258
    POJ 2677 Tour【DP】
    POJ 1160Post Office【DP】
    C基础
    linux面试fork函数题
    linux学习
  • 原文地址:https://www.cnblogs.com/zi-nai-boboyang/p/11437109.html
Copyright © 2020-2023  润新知