题目1139:最大子矩阵

来源:互联网 发布:酷派手机自动开启数据 编辑:程序博客网 时间:2024/06/11 04:10
#include <stdio.h>  #include <stdlib.h>  #define MAX 110     int MaxSubMerticx(int *a,int N)  //一维最大序列和问题  {      int max,dp[MAX],i;         max=a[0];      dp[0]=a[0];      for(i=1;i<N;i++)      {          dp[i]=(dp[i-1]+a[i])>a[i]?(dp[i-1]+a[i]):a[i];  //最长子序列          if(dp[i]>max)              max=dp[i];      }      return max;  }     int main()  {      //      int N,metricx[MAX][MAX],dp[MAX],sum,max;      int i,j,k;               while(scanf("%d",&N)!=EOF)      {          for(i=0;i<N;i++)              for(j=0;j<N;j++)                  scanf("%d",&metricx[i][j]);             max=metricx[0][0];          for(i=0;i<N;i++)       //从第i行开始向下,依次枚举所有可能的矩阵          {              for(j=0;j<N;j++)  //保存从第i行到第j行的列和,相当于纵向压缩,将矩阵列压缩为一个点,从而将最大子矩阵(二维,纵向+横向)转换为最大序列和(一维,纵向一定,横向最大),达到降维的目的                  dp[j]=0;                 for(j=i;j<N;j++)              {                  for(k=0;k<N;k++)   //计算到达j行为止的每一列的和                      dp[k]+=metricx[j][k];                     sum=MaxSubMerticx(dp,N);   //求出在纵向为从i到j行,横向为0-N的最大横向方向子序列                  if(sum>max)                      max=sum;     //更新全局最优解              }          }             printf("%d\n",max);      }      return 0;  }  /**************************************************************    Problem: 1139    User: cust123    Language: C++    Result: Accepted    Time:50 ms    Memory:1020 kb****************************************************************/

0 0