题目:返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
思路:参考上一次的编程,求的是一维数组中,子数组和的最大值。这次是二维数组,如果将二维数组看作一维数组来解决的话,问题就行的通了。于是,首先要解决的是如何把二维数组当作一维来思考。分析:当最大子数组是一行的话,就直接是上一次的问题,用动态规划即可求出最大子数组的和。若最大子数组是两行时,这时就需要考虑是这两行中的连续的那几列构成的数组之和最大。这时,先把同一列上的元素相加成为一个一维数组,在用动态规划来求出行上最大值数组之和。同理,若最大子数组是三行、四行...n行时,问题就可以解决了。假设输入的是n*m的数组,则时间复杂度为(m*n^2).
实现代码如下:
//返回一个二位数组中最大子数组的和 2016/4/6
#include<iostream>
using namespace std;
int dp(int array[],int i)
{
int dp[100][2],j,S;
dp[0][0]=array[0];
dp[0][1]=array[0];
for(j=1;j<i;j++)
{
dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
dp[j][1]=max(array[j],(dp[j-1][1]+array[j]));
}
S=max(dp[i-1][0],dp[i-1][1]);
return S;
}
int main(){
int Array[100][100],len,wid;
cin>>len>>wid;
for(int i=0;i<wid;i++)
{
for(int j=0;j<len;j++)
{
cin>>Array[i][j];
}
}
int Max[wid],MAX=0;
for(int i=0;i<wid;i++)
{
int temp_Array[len];
for(int ii=0;ii<len;ii++){
temp_Array[ii]=Array[i][ii];
}
Max[i]=dp(temp_Array,len);
if(i<len-1)
{
for(int count=i+1;count<wid;count++)
{
for(int j=0;j<len;j++)
{
temp_Array[j]=temp_Array[j]+Array[count][j];
}
int temp_max=dp(temp_Array,len);
Max[i]=max(Max[i],temp_max);
}
}
MAX=max(MAX,Max[i]);
}
cout<<MAX;
return 0;
}
运行截图:
总结:一个问题,当有了思路,就成功了一半。有了方向,只管往前走,就可以做到。