1050 To the Max

本文介绍了一种在O(n^2)时间内解决二维最大子段和问题的方法,首先通过预处理计算出每列的累加和,然后通过枚举两行间的元素进行“压缩”,最后利用一维最大子段和算法求解。

二维的最大子段和,dp

先预处理,sum[i][j]表示矩阵1~i行,第j列的和,用递推可在O(n^2)时间解决

再枚举两行i1,i2(1<=i1<=i2<=n),将夹在i1和i2中间的同一列的元素进行"压缩"

其和可用sum[i2][j]-sum[i1-1][j]表示,然后就是做一维的最大子段和了

一个累加器,从左往右O(n)扫一遍,加上当前元素>0就更新best,<0就把累加器清零

  1. //3446710_AC_32MS_348K
  2. #include<iostream>
  3. using namespace std;
  4. #define MAXN 101
  5. int w[MAXN][MAXN];
  6. int sum[MAXN][MAXN];
  7. int i,j,k,best,n,f;
  8. int main()
  9. {
  10.     //freopen("d:/in.txt","r",stdin);
  11.     for (j=0;j<MAXN;++j)
  12.     {
  13.         sum[0][j]=0;
  14.     }
  15.     while (cin>>n)
  16.     {
  17.         for (i=1;i<=n;++i)
  18.         {
  19.             for (j=1;j<=n;++j)
  20.             {
  21.                 cin>>w[i][j];
  22.             }
  23.         }
  24.         for (j=1;j<=n;++j)
  25.         {
  26.             sum[1][j]=w[1][j];
  27.             for (i=2;i<=n;++i)
  28.             {
  29.                 sum[i][j]=sum[i-1][j]+w[i][j];
  30.             }
  31.         }
  32.         best=0;
  33.         for (i=1;i<=n;++i)
  34.         {
  35.             for (k=i;k<=n;++k)
  36.             {
  37.                 f=0;
  38.                 for (j=1;j<=n;++j)
  39.                 {
  40.                     if (f+sum[k][j]-sum[i-1][j]<0)
  41.                     {
  42.                         f=0;
  43.                     }
  44.                     else
  45.                     {
  46.                         f+=sum[k][j]-sum[i-1][j];
  47.                         if (f>best)
  48.                         {
  49.                             best=f;
  50.                         }
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.         cout<<best<<endl;
  56.     }
  57.     return 0;
  58. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值