dp之二维的最大字段和算法

二维的最大字段和算法:

#include <iostream>

#include <cstring>

using namespace std;

#define MIN -1000000;

#define MAXSIZE 1001//注意边界条件,根据具体问题,更改MAXSIZE

int num[MAXSIZE][ MAXSIZE];

struct Point

{

    intx,y;

}start,end;

int maxsum1(int *num, int len, int &s,int &e)// 一维的最大字段和

{

    inti, b = 0;

    intstart = 1, end = 0;

    intsum = MIN;

 

    for( i = 0; i < len; i++) {

       if (b >= 0) {

           b += num[i];

           end++;

       } else {

           b = num[i];

           start = i;

           end = i;

        }

 

       if (b > sum) {

           sum = b;

           s = start;

           e = end;

       }

    }

   return sum;

}

int maxsum2(int num[][MAXSIZE], int n ,int m,Point &start,Point &end)//n行m列,start

 {                                       //中保存的起始的x,y坐标,end保存的结束的x,y的坐标

    int i , j , k;

    int sum = -0x7FFFFFFF;

    int b[MX];

    for(i=0 ; i<n ; i++)

     {

        memset(b , 0 , sizeof(b));

        for(j=i ; j<m ; j++)

        {

            for(k=0 ; k<m ; k++)b[k] += num[j][k];

            int s,e;

            int max = maxsum1(b, m,s,e);

            if(max > sum)

            {

                sum = max;

                start.x=i;start.y=s-1;

                end.x=j;end.y=e-1;

           }

        }

     }

    return sum;

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值