POJ 1050 (DP)

题目:http://poj.org/problem?id=1050

这个题的基础是最大字段和。

我以前写过最大字段和,如下:

最大字段和:http://www.cnblogs.com/HpuAcmer/archive/2011/11/27/2264856.html

最大子矩阵和的方法和最大字段和一样,转化下就是最大字段和。

思路:

先单独对每行求最大字段和(此时,子矩阵的行为1,就是最大字段和了)

然后,把第i行后的各行对应列的元素加到第i行的对应列元素,每加一行,就求一次最大字段和,这样就把子矩阵的多行压缩为一行了,一行了就是最大字段和了啊!

代码:

#include <stdio.h>
#include <stdlib.h>

int m[101][101];

int main()
{
   int n,max,i,j,k,tmp;

     while( scanf("%d",&n) != EOF)
     {
         max = -10000;
         /*
           输入时,顺便求出各行的最大字段和的最大值 
         */ 
         for(i = 0 ; i < n ; ++i)
         {
               tmp = 0 ;
               for(j = 0 ; j < n ; ++j)
               {
                      scanf("%d",&m[i][j]);       
                      if(tmp > 0) tmp += m[i][j];
                      else tmp = m[i][j];
                      
                      if(tmp > max) max = tmp;
               }
         }
         
         
               
          for(i = 0 ; i < n-1 ; ++i)
          {  
             for(j = i+1 ; j < n ; ++j)   
             {
                   tmp = 0; 
                   for(k = 0 ; k < n ; ++k)
                   {
                        m[i][k] += m[j][k];//相当于把子矩阵多行压缩为一行了 
                        if(tmp > 0) tmp += m[i][k];
                        else tmp = m[i][k];      
                         
                        if(tmp > max) max = tmp; 
                   }
             }
          
          }
          
          printf("%d\n",max);
     } 
    
 //  system("pause");
   return 0;    
}
原文地址:https://www.cnblogs.com/HpuAcmer/p/2485115.html