POJ结题报告_1050_To the Max
2011-11-27 12:32
423 查看
题目描述
思路:
这道题最基本和原始的方法是穷举,但是穷举是一个O(n^4)的算法,题目中明确说明测试数据最大可能是100×100,穷举会超出题目时间限制1000ms。而动态规划是这道题解决的方法。
首先子矩阵的和可以转化为子矩阵中每一列先求和再将他们加起来,即
9 2
-4 1
-1 8
的和可以表示为每列之和得到的数组再求和,即
(9-4-1) (2+1+8)
4 11
所以最大和为4+11=15.这样,就可以将矩阵压缩为一个一维数组,而最大子矩阵的和即是这个一维数组的最大子段和,而最大子段和就可以用动态规划来求解。
最大子段和即是求一个整数序列如{-2,11,-4,13,-5,-2}中和最大的子段,他的最大和子段即是{11,-4,13},和为11-4+13=20
最大子段和的DP递推方程为:
b[i]=max{b[i-1]+a[i],a[i]}
其中b[i]代表最大子段和中前i个数字之和。
这道题中,声明一个二维数组columnarray[i][j]用来存储原始矩阵前i行第j列的和,要求从第i行到第k行第j列的和即是columnarray[k][j]-columnarray[i-1][j]
可将遍历子矩阵转化为遍历压缩之后的和序列,用上述递推方程就可求解。
代码:
WA:
第一次用穷举超时了。
思路:
这道题最基本和原始的方法是穷举,但是穷举是一个O(n^4)的算法,题目中明确说明测试数据最大可能是100×100,穷举会超出题目时间限制1000ms。而动态规划是这道题解决的方法。
首先子矩阵的和可以转化为子矩阵中每一列先求和再将他们加起来,即
9 2
-4 1
-1 8
的和可以表示为每列之和得到的数组再求和,即
(9-4-1) (2+1+8)
4 11
所以最大和为4+11=15.这样,就可以将矩阵压缩为一个一维数组,而最大子矩阵的和即是这个一维数组的最大子段和,而最大子段和就可以用动态规划来求解。
最大子段和即是求一个整数序列如{-2,11,-4,13,-5,-2}中和最大的子段,他的最大和子段即是{11,-4,13},和为11-4+13=20
最大子段和的DP递推方程为:
b[i]=max{b[i-1]+a[i],a[i]}
其中b[i]代表最大子段和中前i个数字之和。
这道题中,声明一个二维数组columnarray[i][j]用来存储原始矩阵前i行第j列的和,要求从第i行到第k行第j列的和即是columnarray[k][j]-columnarray[i-1][j]
可将遍历子矩阵转化为遍历压缩之后的和序列,用上述递推方程就可求解。
代码:
#include <iostream> using namespace std; int main() { int n=0; cin>>n; if (n<=0) return -1; int **columnarray=new int*[n+1]; int i=0,j=0,k=0,temp; for(i=0;i<n+1;++i){ columnarray[i]=new int[n+1]; memset(columnarray[i],0,sizeof(int)*(n+1)); }//动态分配二维数组并且置为0 for (i=1;i<=n;++i){ for (j=1;j<=n;++j){ cin>>temp; columnarray[i][j]=columnarray[i-1][j]+temp;//columnarray[i][j]表示第j列前i行的和 } } int sum=0,max=-9999,x; for (i=1;i<n+1;++i){ for (k=i;k<n+1;++k){ for (j=1;j<n+1;++j){ x=columnarray[k][j]-columnarray[i-1][j]; if(sum>0) sum+=x; else sum=x; if(max<sum) max=sum; } sum=0; } }//DP求最大子段和 cout<<max; return 0; }
WA:
第一次用穷举超时了。
相关文章推荐
- 【原】 POJ 1050 To the Max 求二维矩阵的最大子矩阵 解题报告
- POJ-1050-To the Max 解题报告
- POJ 1050 To the Max 枚举+dp
- POJ 1050 To the Max(最大字矩阵)【模板】
- POJ 1050 to the max
- POJ 1050:To the Max
- POJ 1050 To the Max
- POJ ---1050 To the Max
- POJ 1050 To the Max && POJ 2479 Maximum sum(DP最大连续子段和)
- G - To the Max POJ - 1050 最大子矩阵和
- poj 1050 || hdu 1081 To The Max
- poj 1050 To the Max
- POJ 1050 To the Max
- POJ 1050 To the Max(动态规划、最大子矩阵和)
- POJ1050-To the Max
- POJ 1050 To the Max(简单DP)
- POJ1050 To the Max (最大子段和,最大子矩阵)
- POJ 1050:To the Max
- POJ 1050 To the Max 暴力,基础知识 难度:0
- POJ - 1050 To the Max