问题标题: 酷町堂:1290 糖果盒(candybox):90分

0
0
已解决
屠永乐
屠永乐
高级守护
高级守护
#include<iostream>
using namespace std;
int n,m,a[301][301],s[301][301],f[301][301],f1[301][301],ans;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        cin>>a[i][j];
        if(a[i][j]==0)a[i][j]=-100000000;
        s[i][j]=s[i][j-1]+a[i][j];
    }
    for(int i=1;i<=m;i++)
    for(int j=i+1;j<=m;j++)
    for(int k=1;k<=n;k++){
        f1[i][j]=max(f1[i][j],0)+s[k][j]-s[k][i-1];
        f[i][j]=max(f[i][j],f1[i][j]);
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    ans=max(ans,f[i][j]); 
    cout<<ans;
    return 0;
} 

0
已采纳
贾文卓
贾文卓
高级光能
高级光能

你这有问题,最后打擂台的时候要保证j>=i,而且两个循环的终值都是m。

而且三重循环中的第二重循环应该是

for(int j=i;j<=m;j++)
贾文卓在2018-04-09 19:07:04追加了内容

因为最大子矩阵和有可能是一列。

0
蒋智航
蒋智航
高级天翼
高级天翼

我有#2测试点,你要吗?

0
我要回答