题意:给定一个n*n的矩阵,求一个子矩阵,使得该矩阵的元素之和最大。
思路:经典的DP。由一维到二维。
1.必须先了解一维的情况,对于一维的数组而言,则转化为用DP求最大连续子序列,DP的状态方程为:sum[i] = max(sum[i-1] + num[i], 0)。
例如: num[]: -5, 7, -2, -6, 5, -1, 4
sum[]: 0, 7, 5, 0, 5, 4, 8
2.对于二维的情况,则可转化为一维。将子矩阵的所有相同列的元素加在一起,问题就解决了。
例如: 若子矩阵为: -1, -2, -3, 5, 4
2, -5, 4, 7, 6
5, 5, -6, -2, -7
则now[]为: 6, 3, -5, 10, -3
代码:
#include<iostream>
using namespace std;
const int Max = 105;
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int n, i, j, k, row, col, sum, ans;
int num[Max][Max], now[Max];
cin >> n;
row = col = n;
for(i = 0; i < row; i ++)
for(j = 0; j < col; j ++)
cin >> num[i][j];
ans = sum = 0;
for(i = 0; i < row; i ++)
{
memset(now, 0, sizeof(now));
for(j = i; j < row; j ++) // 求第i行到第j行的子矩阵。
for(k = 0, sum = 0; k < col; k ++)
{
now[k] += num[j][k];
sum = max(sum + now[k], 0);
if(sum > ans)
ans = sum;
}
}
cout << ans << endl;
return 0;
}
分享到:
相关推荐
1. **数列和级数**:数列求和、级数收敛性分析(poj1286, poj2409, poj3270, poj1026)。 2. **数学归纳法**:通过归纳推理解决问题(poj2947, poj1487, poj2065, poj1166, poj1222)。 3. **GCD算法**:最大公约数...
- (poj2528, poj2828, poj2777, poj2886, poj2750):一种高效的数据结构,用于区间求和等操作。 2. **分块**: - (poj2482, poj2352):将数据分为多个区块,提高查询效率。 3. **树套树**: - (poj1195, poj...
10. poj_1744.c - "Array Division":可能需要处理数组的分割和求和问题,对于理解和优化循环及数组操作有帮助。 每一道POJ题目都是一个独特的编程挑战,它们不仅锻炼了作者的编程技巧,也提供了学习各种算法和数据...
【标题】"树状数组练习:POJ 2481(JAVA)" 是一篇关于使用树状数组(也称为线段树)解决编程竞赛问题的文章。这篇文章可能详细讲解了如何运用这种数据结构来解决特定的问题POJ 2481。POJ(Programming Online Judge)...
7. **位操作**:在解决空间效率问题时,位操作经常被用到,如快速求和、集合操作、编码等。 8. **递归与分治**:如快速幂运算、归并排序、分治法解约瑟夫问题等。 9. **贪心算法**:适用于部分最优解的问题,如...
对于POJ 1990题目,我们需要解决的问题可能涉及到对某一区间进行快速求和或者更新操作,而树状数组正好可以满足这种需求。 题目描述虽然简短,但隐藏了对数据结构和算法的深度理解要求。"2个树状数组"的提示意味着...
- **输入格式**:输入一个正整数 \( n \),表示求和项数。 - **处理逻辑**: - 使用循环计算 \( e \) 的近似值,即 \( e \approx 1 + \frac{1}{1!} + \frac{1}{2!} + \ldots + \frac{1}{n!} \)。 - **输出格式**:...
在本题“POJ 3264”中,我们可能面临的是一个区间最值或者区间求和的计算任务。线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息...
在POJ 2029这个题目中,我们可能面临的问题是需要对一个二维矩阵进行动态更新和求和查询,例如计算某一个矩形区域内的元素总和。 二维树状数组的基本思想是将二维空间转化为一维存储,通常是通过行优先或列优先的...
【标题】"POJ3094-Quicksum" 是北京大学在线编程平台POJ上的一道题目,这道题目主要考察的是快速求和算法。快速求和,顾名思义,是在较短的时间内计算一系列数字之和的技术,通常与高效的数据结构和算法设计有关。 ...
树状数组通常用于解决求和、计数或找到某个范围内的最大值、最小值等问题。 在POJ 3321这个题目中,可能要求参赛者使用DFS来遍历图,结合树状数组来解决特定的问题。具体问题内容因没有提供详细描述而未知,但可以...
【标签】"POJ 1845 Sumdiv"中的"POJ"是比赛平台的标识,"1845"是题目在平台上的编号,"Sumdiv"是题目名称的英文缩写,可能指的是求和与除法相关的数学问题。 【压缩包子文件的文件名称列表】: 1. "POJ1845-Sumdiv....
总体来看,西工大POJ作业中的题目涉及了编程和数学的多个知识点,包括循环控制、条件判断、数值运算、数学函数(如指数、平方根)、整数和浮点数处理、数组操作、素数检测、组合优化和序列求和等。这些问题不仅要求...
在 POJ 百练 题目分类中,简单计算类题目包括鸡兔同笼(2750)、棋盘上的距离(1657)、校门外的树(2808)、填词(2801)、装箱问题(1017)、平均年龄(2714)、数字求和(2796)、两倍(2807)、肿瘤面积(2713)...
树状数组,又称二叉索引树(Binary Indexed Tree, BIT),是一种用于快速查询和更新数组区间元素的方法,特别适合处理区间求和以及对数组元素进行批量加法操作的问题。这种数据结构可以达到O(logN)的时间复杂度,...
2. **累加求和**:遍历数组,将所有元素的值累加到变量`b`中。 3. **计算平均值**:在所有数据读取完毕后,用总和`b`除以数组长度12,得到平均值。 4. **格式化输出**:最后,使用`cout`语句,以“$”开头,输出保留...
在本篇中,我们将深入学习二维树状数组的应用,并通过解决POJ 1195问题来实践这一概念。 POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形...
通过理解和掌握树状数组,不仅可以解决POJ 3067这类问题,还可以应用于各种需要高效区间查询和修改的场景,例如动态统计、求和等问题。同时,树状数组是算法竞赛和实际编程中常用的工具,对于提升解决问题的能力...
1. **数学问题**:例如,质因数分解、数列求和、模运算等。AC代码可能涉及到数学计算和优化,避免冗余计算,提高效率。 ```cpp // 示例:质因数分解 void prime_factors(int n) { for (int i = 2; i * i ; i++) { ...
在讨论的三道poj模拟题中,都涉及到二分查找的核心思想与实现方法,通过实际的问题场景来加深对二分查找算法的理解与应用。 第一题是Cablemaster(poj1064)。题目描述了一个实际应用问题,需要从一定数量的电缆中...