P2706 巧克力
题目背景
王7的生日到了,他的弟弟准备送他巧克力。
题目描述
有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力。就在送出它的前一天晚上,有老鼠夜袭巧克力盒,某些位置上被洗劫并且穿了洞。所以,你——王7的弟弟王9,必须从这个满目苍夷的盒子中切割出一个矩形巧克力盒,其中不能有被老鼠洗劫过的格子且使这个盒子里的巧克力尽量多。
输入输出格式
输入格式:
第一行有两个整数 n、m。第 i+1行的第 j 个数表示a[ i , j ]。如果这个数为 0 ,则表示这个位置的格子被洗劫过。
输出格式:
输出最大巧克力数。
输入输出样例
输入样例#1:
3 4 1 2 3 4 5 0 6 3 10 3 4 0
输出样例#1:
17 //10 3 4这个矩形的巧克力数最大
说明
1≤n,m≤300
0≤a[i,j]≤255
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 500 using namespace std; int n,m,s,x,y,a[N][N],sum[N][N],v1[N],v2[N],ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) ch=getchar(); while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int main() { n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { a[i][j]=read(); if(!a[i][j]) v1[i]+=1,v2[j]+=1; sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]; } for(int l1=0;l1<n;l1++) for(int l2=0;l2<m;l2++) for(int i=0;i<=n-l1+1;i++) if(v1[i+l1]-v1[i]==0) for(int j=0;j<=m-l2+1;j++) if(v2[j+l2]-v2[j]==0) { x=i+l1,y=j+l2; ans=max(ans,sum[x][y]-sum[x][j]-sum[i][y]+sum[i][j]); } printf("%d",ans); return 0; }
智障的33分代码
时间: 2024-10-09 06:04:14