洛谷——P2706 巧克力

https://www.luogu.org/problem/show?pid=2706

题目背景

王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

 

如果将0 的点赋值为极小值得点,问题等同于求的最大矩阵和、

参考http://www.cnblogs.com/Shy-key/p/7608340.html这里不赘述了

 1 #include <cstdio>
 2 
 3 const int INF(1e7);
 4 const int N(305);
 5 int n,m;
 6 long long val[N][N],tot,ans;
 7 
 8 int Presist()
 9 {
10     scanf("%d%d",&n,&m);
11     for(int i=1; i<=n; ++i)
12       for(int j=1; j<=m; ++j)
13       {
14           scanf("%lld",&val[i][j]);
15           if(!val[i][j]) val[i][j]=-INF;
16           val[i][j]+=val[i-1][j];
17       }
18     for(int top=0; top<n; ++top)
19         for(int i=top+1; i<=n; ++i)
20         {
21             for(int j=1; j<=m; ++j)
22             {
23                 if(tot<0) tot=val[i][j]-val[top][j];
24                 else tot+=val[i][j]-val[top][j];
25                 if(tot>ans) ans=tot;
26             }   tot=0;
27         }
28     printf("%lld\n",ans);
29     return 0;
30 }
31 
32 int Aptal=Presist();
33 int main(int argc,char*argv[]){;}

 

posted @ 2017-09-28 20:22  Aptal丶  阅读(290)  评论(0编辑  收藏  举报