POJ1050 To the Max

题意:
求最大子矩阵和。其中一个矩阵的和定义为矩阵中所有元素相加的和。

输入:
首先输入一个N,然后输入一个N*N的矩阵

输出:
输出结果即为最大子矩阵和

思路:
本题是一道经典的动态规划题目。可以联想到最大子段和的求解方法。

最大子段和的求解方法:
假设data[]数组存储原始的数据,记res[i]表示包含data[i]元素在内的前i + 1个元素的最大子段和(此子段必须包含data[i]),则有如下递推式

  res[i] = max(res[i - 1] + data[i], data[i])

其中,res[0] = data[0]。最大子段和即为max(res[i])

最大子矩阵和的求解思路:

           a11 a12 a13
           a21 a22 a23
           a31 a32 a33

以上面的矩阵为例,先对矩阵的每一行求最大子段和,然后求a11 + a 21, a12 + a22, a13 + a23的最大子段和……最后,求a11 + a21 + a31,a12 + a22 + a32, a13 + a23 + a33的最大字段和, 其中的最大值即为最终结果。其基本思路就是将矩阵进行压缩,将矩阵压缩成一行的字段,从而利用最大子段和的求解方法进行求解。

代码如下:

#include <iostream>

using namespace std;

#define MAXLEN 110      //数组最大长度
#define MINNUM -1000

int DP(int n,int data[]);
int max(int a,int b);

int main()
{
    int n = 0;
    int data[MAXLEN][MAXLEN] = {0};    //原始数据
    int sum[MAXLEN] = {0};             //压缩后的字段
    int ans = -1000000;                //最终结果
    int t = 0;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin>>data[i][j];
        }
    }

    for(int i = 0; i < n; i++)              //起始行为第i行
    {
        for(int p = 0; p < n; p++)
        {
            sum[p] = 0;
        }
        for(int k = 0; k < n - i; k++)      //总共计算k+1行
        {
            for(int j = 0; j < n; j++)
            {
                sum[j] = sum[j] + data[i + k][j];
            }
            t = DP(n,sum);                  //压缩后的最大子段和
            if(ans < t)                     //记录最大值
            {
                ans = t;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

int DP(int n,int data[])
{
    //求一串序列的连续子序列的最大和
    //res[i]表示在包含data[i]的情况下,前i个元素组成的序列的最大和
    int maxsum = data[0];
    int res[MAXLEN] = {-10000};
    res[0] = data[0];
    for(int i = 1; i < n; i++)
    {
        res[i] = max(res[i - 1] + data[i],data[i]);
        if(maxsum < res[i])
        {
            maxsum = res[i];
        }
    }
    return maxsum;
}

int max(int a,int b)
{
    if(a > b)
    {
        return a;
    }
    else
    {
        return b;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值