zoukankan      html  css  js  c++  java
  • 洛谷 题解 P2280 【[HNOI2003]激光炸弹】

    一道很好的二维前缀和模板题。

    什么是二维前缀和?

    404

    从这张图可以看出前缀和的求法:

    Map[i][j]=Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1]+Map[i][j];
    

    这道题的代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN=5000+10;
    int n,r;
    int Map[MAXN][MAXN];//数组开的下
    inline int read()
    {
    	int tot=0;
    	char c=getchar();
    	while(c<'0'||c>'9')
    		c=getchar();
    	while(c>='0'&&c<='9')
    	{
    		tot=tot*10+c-'0';
    		c=getchar();
    	}
    	return tot;
    }
    int main()
    {
    	int x,y,v;
    	n=read();r=read();
    	for(int i=1;i<=n;i++)
    	{
    		x=read();y=read();v=read();
    		Map[x+1][y+1]=v;
    	}
    	for(int i=1;i<=5000;i++)//因为地图最大是5000*5000的
    		for(int j=1;j<=5000;j++)
    			Map[i][j]=Map[i-1][j]+Map[i][j-1]-Map[i-1][j-1]+Map[i][j];//求出这张图的二维前缀和
    	int ans=0;
    	for(int i=0;i<=5000-r;i++)
    		for(int j=0;j<=5000-r;j++)//放置炸弹的范围,要减去边长,否则肯定不是最优的
    			ans=max(ans,Map[i+r][j+r]-Map[i][j+r]-Map[i+r][j]+Map[i][j]);//先找到爆炸范围中的总价值,再取最大值
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    java语言基础1问题汇总
    java从命令行接受多个数字求和输出
    关于Django迁移出现问题
    python中在ubuntu中安装虚拟环境及环境配置
    MVC与MVT
    前端性能优化
    less、sass、stylus
    bootstrap
    Swiper4.x使用方法
    swiper
  • 原文地址:https://www.cnblogs.com/hulean/p/10813434.html
Copyright © 2011-2022 走看看