UVA108 Maximum Sum(最大子序列和升级版:一维变二维,二维再变回一维)

题目链接:https://cn.vjudge.net/contest/311091#problem/B
解析:求二维数组中,一个子矩阵,保证它的和是最大的。
例如:
0 −2 −7 0
9 2 −6 2
−4 1 −4 1
−1 8 0 −2
子矩阵:
9 2
−4 1
−1 8(它的和是最大的)
分析
1.二维数组有i行,把i行合并成一行,两层for循环,遍历所有的组合情况。

 for(int i=1; i<=n; i++)
   for(int j=i; j<=n; j++)

在这里插入图片描述
黑点,代表数组。
黑线表示i=1时,各种组合情况。
红线代表i=2时,各种组合情况。
蓝线代表i=3时,各种组合情况。
以此类推…
2.输入的时候用前缀和,把每一列向相加。
3.把各种组合情况,从第一个数到最后一个数遍历,找最大值。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
    int n,a[200][200],sum,mx;
    while(~scanf("%d",&n)&&n){
        mx=-inf;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                scanf("%d",&a[i][j]);
        if(n==1){
            printf("%d\n",a[1][1]);
            continue;
        }
        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++)
                a[i][j]+=a[i-1][j];//前缀和
        }
        for(int i=1; i<=n; i++)
        {
            for(int j=i; j<=n; j++)
            {
                sum=0;
                for(int k=1; k<=n; k++)//每一种组合情况相当于一行,然后一行的第一个数到第n个数
                {
                    sum+=(a[j][k]-a[i-1][k]);
                    if(sum<0)
                        sum=0;
                    if(sum>mx)
                        mx=sum;
                }
            }
        }
        printf("%d\n",mx);
    }
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zaiyang遇见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值