HDU1003+数组最大子序列和及其扩展(循环数组,二维矩阵等)

WA了好多次,为了对应全是负数的情况,需要多借助一个变量,缓存一个begin位置,只在最大值更新时才更新begin的值。

扩展1:数组有可能是环状的,http://cs.scu.edu.cn/soj/problem.action?id=2766

这时候需要比较,正常求出的max1和跨段的max2,取最大值。跨度max2的求法 = 数组的sum - 连续和的最小值

扩展2:由一维扩展到二维数组。求矩阵中的最小和(http://poj.org/problem?id=1050)。

#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;

using namespace std;
//存储以坐标i,j到1,1的面积,用于计算面积
int P[101][101] = {0};
//用于存储矩阵
int Matrix[101][101] = {0};

//初始化数组P

void init(int N)
{
    for(int i=0;i<=N;i++)
        P[i][0] = 0;
    for(int i=0;i<=N;i++)
        P[0][i] = 0;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=N;j++)
            P[i][j] = P[i-1][j] + P[i][j-1] - P[i-1][j-1] + Matrix[i][j];
}


//求长条矩阵的和,横坐标为x,纵坐标从y1到y2的长条的和。y2>y1
int lsum(int y1,int y2,int x)
{
    int sum = P[x][y2] - P[x][y1-1] - P[x-1][y2] + P[x-1][y1-1];
    //cout<<sum<<endl;
    return sum;
}


int main()
{
    int N; 
    while(scanf("%d",&N)==1)
    {
        int temp = 0;
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
               scanf("%d",&Matrix[i][j]);
        init(N);

        int y1,y2,x;
       int maxMatrix = -65535;
       int sumMatrix;
       for(y1=1;y1<N;y1++)
           for(y2=y1;y2<=N;y2++)
           {
                 sumMatrix = 0;
                 for(x=1;x<=N;x++)
                {
                     sumMatrix += lsum(y1,y2,x);
                     if(sumMatrix>maxMatrix)
                    {
                          maxMatrix = sumMatrix;
                   }
                    if(sumMatrix<0)
                        sumMatrix = 0;
              }
         }
         cout<<maxMatrix<<endl;
     }
     return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值