洛谷——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[]){;}
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。