POJ 1050
来源:互联网 发布:凹陷性疤痕 知乎 编辑:程序博客网 时间:2024/05/01 13:44
描述
给定一个二维数组,包含正整数、负整数,一个子矩阵是在该数组中,任何邻近的1*1或更大的子数组。矩阵的和是矩形中所有元素的和。在该问题中,有最大和的子矩阵称为最大子矩阵。
例如,给定二维数组:
最大子矩阵是左下角:
该子矩阵的和为15
输入
输入包含N*N整形数组,
输入的第一行是一个正整数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具体说明
- 一维数组的最大子数组和
描述:
给定数组:a[0],a[1],a[2],...,a[n] ,求其中连续的一段子数组,使子数组的和最大。
dp算法:a[i] 为第i 个元素,dp[i] 为以a[i] 结尾的最大子数组和,则:dp[i]=max{a[i],dp[i−1]+a[i]}
若dp[i−1]>0 , 则dp[i]=dp[i−1]+a[i]
若dp[i−1]<0 , 则dp[i]=a[i]
由于不用记录dp[i]中的位置信息(选取的i),dp[i]可用变量dp代替:
若dp>0 , 则dp=dp+a[i]
若dp<0 , 则dp=a[i] - 二维的最大子矩阵和
枚举行的组合,
求出(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
- POJ 1050
- poj 1050
- POJ 1050
- POJ 1050
- poj 1050
- poj 1050
- POJ 1050
- poj 1050
- poj--1050
- poj 1050
- POJ 1050
- POJ 1050
- Poj 1050
- POJ 1050
- poj-1050
- poj 1050
- poj 1050
- POJ 1050
- Linux知识点小结
- 【bzoj2453】维护队列 分块
- 崇明东平森林公园一日游
- 微服务实战(一):微服务架构的优势与不足
- 从高位开始逐位输出一个整数的各位数字(不用数组)
- POJ 1050
- 25个Java机器学习工具&库
- API设计原则
- Linux下出现launch failed.Binary not found的解决方案
- 实例8:实现应用对话框主题的关于Activity
- 推荐系统笔记二、矩阵分解协同过滤
- 写点工作两年的一些感想吧
- zoj 3777 Problem Arrangement 【状压dp】
- connect()函数阻塞