#include <iostream>
using namespace std ;

//一维最大子段和问题:动态规划
int MaxSum( int n, int *a)
{
 int sum = 0, b = 0;
 for( int i = 0; i < n; i++ )
 {
  if(b > 0) b+= a[i] ;
  else b = a[i] ;
  if(b>sum) sum = b ;
 }
 return sum ;
}

//二维最大字段和问题:动态规划
int MaxSum2( int r, int c, int **a)
{
 int sum = 0, max;
 int *b = new int[c] ;
 for( int i=0; i < r; i++)
 {
  for(int k=0; k < c; k++) b[k] = 0;
  for(int j=i; j < r; j++)
  {
   for( int k=0; k < c; k++) b[k] += a[j][k] ;
   max = MaxSum(c, b) ;
   if(max > sum) sum = max ;
  }
 }
 return sum ;
}

int main()
{
 int *a, **b ;
 int al, br, bc ;
 cout << "请输入一维数组的长度和数据: " << endl ;
 cin >> al ;
 a = new int[al];
 for(int i=0; i < al; i++) cin >> a[i] ;
 cout << "一维最大字段和: " << MaxSum(al,a) << endl;
 cout << "请输入二维数组的行数、列数和数据:" << endl ;
 cin >> br >> bc ;
 b = new int*[br] ;
 for(int i=0; i<br; i++)
 {
  b[i] = new int[bc] ;
 }
 for(int j=0; j < br; j++)
 {
  for(int i=0; i<bc; i++)
  {
   cin >> b[j][i] ;
  }
 }
 cout << "二维最大字段和:" << MaxSum2(br, bc, b) << endl ;
 for(int i=0; i<br; i++)
 {
  delete []b[i] ;
  b[i] = NULL ;
 }
 delete []b ;
 b = NULL ;
 return 0 ;
}