博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2003]激光炸弹
阅读量:5230 次
发布时间:2019-06-14

本文共 883 字,大约阅读时间需要 2 分钟。

题目:BZOJ1218、洛谷P2280。

题目大意:给你一个5000*5000的平面,一些点可能有价值,求边长为r的正方形最多能框住多少价值(正方形的边必须与x、y轴平行)。

解题思路:二维前缀和dp。设dp[i][j]表示(1,1)~(i,j)的总价值,那么dp[i][j]=a[i][j]+dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]。

求正方形(i-r+1,j-r+1)~(i,j)的价值和就为dp[i][j]-dp[i][j-r]-dp[i-r,j]+dp[i-r,j-r]。

由于内存的限制,a数组应该直接用dp数组替代,否则你会华丽的MLE!

注意坐标从0开始,所以我给每个x和y都加了1。

时间复杂度$O(5000^2)$。

C++ Code:

#include
#include
using namespace std;int dp[5050][5050];int main(){ int n,r; scanf("%d%d",&n,&r); memset(dp,0,sizeof(dp)); for(;n--;){ int x,y,v; scanf("%d%d%d",&x,&y,&v); dp[x+1][y+1]=v; } for(int i=1;i<5002;++i) for(int j=1;j<5002;++j) dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]; int ans=0; for(int i=r;i<5002;++i) for(int j=r;j<5002;++j){ int p=dp[i][j]-dp[i][j-r]-dp[i-r][j]+dp[i-r][j-r]; if(p>ans)ans=p; } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/Mrsrz/p/7382139.html

你可能感兴趣的文章
安卓版有道词典的离线词库-《21世纪大英汉词典》等
查看>>
day2
查看>>
TestLink在线Excel用例转换xml
查看>>
winfrom如何在listview中添加控件
查看>>
利用ns3导出wlan网络性能参数学习笔记
查看>>
重写优先队列优先级
查看>>
javascript 之基本数据类型、引用数据类型区别--02
查看>>
剑指offer--17.第一个只出现一次的字符
查看>>
最近找工作面的面试题目汇总(一)
查看>>
20不努力,30做助理(转载)
查看>>
程序员如何描述清楚线上bug
查看>>
再读c++primer plus 004
查看>>
OpenSSL 1.0.1 TLS/DTLS heartbeat information disclosure漏洞 测试
查看>>
软工课评价
查看>>
UIDeviceOrientationDidChangeNotification和UIApplicationDidChangeStatusBarFrameNotification
查看>>
Test is dead
查看>>
SPEC CPU2006的安装和使用
查看>>
webRTC脱坑笔记(二)— webRTC API之MediaStream(getUserMedia)
查看>>
Factory Design Pattern
查看>>
WinForm下窗体标题栏上有“帮助”按钮
查看>>