DP(悬线法)+二维前缀和【p2706】巧克力
2024-08-24 22:04:14
Background
王7的生日到了,他的弟弟准备送他巧克力。
Description
有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力。就在送出它的前一天晚上,有老鼠夜袭巧克力盒,某些位置上被洗劫并且穿了洞。所以,你——王7的弟弟王9,必须从这个满目苍夷的盒子中切割出一个矩形巧克力盒,其中不能有被老鼠洗劫过的格子且使这个盒子里的巧克力尽量多。
Input
第一行有两个整数 n、m。第 i+1行的第 j 个数表示a[ i , j ]。如果这个数为 0 ,则表示这个位置的格子被洗劫过。
Output
输出最大巧克力数。
表示很水的一个题.要不是数据有问题我就切了
悬线法+二维前缀和。吼啊
不过貌似比只写二维前缀和的麻烦一点.
我们预处理出来悬线法用的数组.(记得变一下限制条件.
然后真正做悬线法的时候.
我们可以得到一个合法矩形.
其左上角坐标,右下角坐标均可求.
然后用二维前缀和算一下即可.
PS:这题数据有问题,读入矩阵的时候要用\(cin\)
代码
#include<cstdio>
#include<algorithm>
#include<iostream>
#define R register
#define N 308
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,ans;
int res[N][N],sum[N][N];
int ri[N][N],le[N][N],up[N][N];
inline int calc(int a,int b,int c,int d)
{
return (sum[c][d]-sum[c][b-1]-sum[a-1][d]+sum[a-1][b-1]);
}
int main()
{
in(n),in(m);
for(R int i=1;i<=n;i++)
for(R int j=1;j<=m;j++)
{
cin>>res[i][j];
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+res[i][j];
ri[i][j]=le[i][j]=j;
up[i][j]=1;
}
for(R int i=1;i<=n;i++)
for(R int j=2;j<=m;j++)
if(res[i][j] and res[i][j-1])
le[i][j]=le[i][j-1];
for(R int i=1;i<=n;i++)
for(R int j=m-1;j>=1;j--)
if(res[i][j] and res[i][j+1])
ri[i][j]=ri[i][j+1];
for(R int i=1;i<=n;i++)
for(R int j=1;j<=m;j++)
{
if(res[i][j] and res[i-1][j])
{
le[i][j]=max(le[i][j],le[i-1][j]);
ri[i][j]=min(ri[i][j],ri[i-1][j]);
up[i][j]=up[i-1][j]+1;
}
int a=i-up[i][j]+1,b=le[i][j],c=i,d=ri[i][j];
ans=max(ans,calc(a,b,c,d));
}
printf("%d",ans);
}
最新文章
- 第八篇 SQL Server代理使用外部程序
- 二模 (1) day2
- Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)
- [cocoapods速成] cocoapods的基本用法和自制 podspec
- Android Audio System 之一:AudioTrack如何与AudioFlinger
- asp.net linq查询环境搭建
- Java 并发 线程的优先级
- jq.paginator分页插件稍加修改
- c#:ThreadPool实现并行分析,并实现线程同步结束
- [转帖]Windows 上面IE的历史
- ROS中使用Kinect摄像头和usb摄像头
- 几个jdbc小技巧
- c语言学习5
- 基于cdh5.10.x hadoop版本的apache源码编译安装spark
- 浏览器的cookie的值改成字典格式
- ASP.NET MVC5使用AjaxHelp
- dubbo入门之微服务客户端服务端配置
- springmvc 解决@ResponseBody注解返回中文乱码
- kali linux 2018.2 mysql密码修改后无效,外部无法连接问题。
- WPF实现动画的几种方式及其小案例
热门文章
- [CF1019A]Elections
- 2018宁夏邀请赛L Continuous Intervals
- POJ2155 Matrix 【二维线段树】
- 怎么替换jar包里面的文件?
- Linux重定向: >; 和 &;>; 区别
- 团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量
- linux 端口号、进程id、杀进程、查询tcp的连接(各种状态的)
- Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
- POJ 1064---二分搜索法
- 【BZOJ3670】【NOI2014】动物园 [KMP][倍增]