POJ 1050

来源:互联网 发布:凹陷性疤痕 知乎 编辑:程序博客网 时间:2024/05/01 13:44

描述

给定一个二维数组,包含正整数、负整数,一个子矩阵是在该数组中,任何邻近的1*1或更大的子数组。矩阵的和是矩形中所有元素的和。在该问题中,有最大和的子矩阵称为最大子矩阵。
例如,给定二维数组:

0941221876400212

最大子矩阵是左下角:
941218

该子矩阵的和为15

输入

输入包含N*N整形数组,
输入的第一行是一个正整数N,表示二维方阵的边长。
N2个整数,空白分隔(空格和换行),按行排列。0<N100,n[127,127]n

输出

最大子矩阵的和

输入样例

4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1

8 0 -2

输出样例

15

思路

1 动态规划

动态规划,Dynamic programming,简称:DP
1. 二维数组划分为多行一维数组,每行进行计算
2. 每行一维数组的最大子数组和。
3. 累加总和

2具体说明

  1. 一维数组的最大子数组和
    描述:
    给定数组:
    a[0],a[1],a[2],...,a[n],求其中连续的一段子数组,使子数组的和最大。
    dp算法:
    a[i]为第i个元素,dp[i]为以a[i]结尾的最大子数组和,则:
    dp[i]=max{a[i],dp[i1]+a[i]}

    dp[i1]>0, 则 dp[i]=dp[i1]+a[i]
    dp[i1]<0, 则 dp[i]=a[i]
    由于不用记录dp[i]中的位置信息(选取的i),dp[i]可用变量dp代替:
    dp>0, 则 dp=dp+a[i]
    dp<0, 则 dp=a[i]
  2. 二维的最大子矩阵和
    枚举行的组合,
    求出(1,1),(1,2),…,(1,n)的最大值
    再求(2,2),(2,3),…,(2,n)的最大值,直到(m,n)

C 实现

#include <stdio.h>#define MAXSIZE 101//所有数组从[1][1]位置开始计数,避免混乱// 求一维数组中最大的子数组和int maxArray(int n, int arr[]){    int i, sum = 0, max = arr[1];    for (i = 1; i <= n; ++i)    {        if(sum > 0)        {            sum += arr[i];        }        else        {            sum = arr[i];        }        if(sum > max)        {            max = sum;        }    }    return max;}// 求二维数组中最大子矩阵和int maxMatrix(int n, int arr[][MAXSIZE]){    int max = arr[1][1];    int sum = 0;    int i,j,k;    int temp_arr[MAXSIZE];    for(i = 1; i <= n; ++i)    {        for(j = 1; j <= n; ++j)//只有起始行改变,temp_arr数组才初始化        {            temp_arr[j] = 0;        }        for(j = i; j <= n; ++j)//枚举行的范围,j为当前行,循环从i行到第n行        {            for(k = 1; k <= n; ++k)//k为j行的每个元素            {                temp_arr[k] += arr[j][k];// temp_arr[k]表示从第i行到第n行中第k列的总和            }            sum = maxArray(n, temp_arr); //求出该行中最大的子数组和            if(sum > max)            {                max = sum;            }        }    }    return max;}int main(){    int n,i,j,max;    int arr[MAXSIZE][MAXSIZE];    while(~scanf("%d", &n))//while依次读入多组二维数组,~scanf("%d", &n)相当于scanf("%d", &n) != EOF      {        for(i = 1; i <= n; ++i)        {            for(j = 1; j <= n; ++j)            {                scanf("%d", &arr[i][j]);            }        }        max = maxMatrix(n,arr);        printf("%d\n",max);    }    return 0;}

参考

http://blog.csdn.net/hitwhylz/article/details/11848439

0 0
原创粉丝点击