1、2维最大子段和

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1000

int MaxSubInterval(int a[], int n)			//标准的一维最大子段和 
{
	int sum = 0, tp = 0;
	for(int i=0; i<n; i++)
	{
		if(tp > 0)
			tp += a[i];
		else
			tp = a[i];
		if(sum < tp)
			sum = tp;
	}
	return sum;
}

int MaxSubMartix(int a[][MAX], int m, int n)		//二维最大子段和问题
{
	int tp[MAX], sum = 0;
	for(int i=0; i<m; i++)
	{
		memset(tp, 0, sizeof(tp) );
		for(int j=i; j<m; j++)
		{
			for(int k=0; k<n; k++)
				tp[k] += a[j][k];		

			int max = MaxSubInterval(tp, n);
			if(max > sum)	sum = max;
		}
	}
	return sum;
}

/*

int MaxSubInterval(int a[], int n, int size_y)			//一维的n个数的最大子段和 
{
	int sum = 0, tp;
	for(int i=0; i<n-size_y; i++)
	{
		tp = 0;
		for(int j=i; j<i+size_y; j++)
		{
			if(tp > 0)
				tp += a[j];
			else
				tp = a[j];	
		}
		if(sum < tp)
				sum = tp;
	}
	return sum;
}

int MaxSubMartix(int a[][MAX], int m, int n, int size_x, int size_y)		//二维size_x * size_y 个数的最大子段和
{
	int tp[MAX], sum = 0;
	for(int i=0; i<m-size_x; i++)
	{
		memset(tp, 0, sizeof(tp) );
		for(int j=i; j<i+size_x; j++)
		{
			for(int k=0; k<n; k++)
				tp[k] += a[j][k];		
		}
			int max = MaxSubInterval(tp, n, size_y);
			if(max > sum)	sum = max;
		
	}
	return sum;
}
*/





附件列表

     

    posted @   sober_reflection  阅读(163)  评论(0编辑  收藏  举报
    努力加载评论中...
    点击右上角即可分享
    微信分享提示