zoukankan      html  css  js  c++  java
  • 求最大子矩阵

    【原创】

    最大子矩阵,也就是在一个矩阵中找一个子矩阵,使其和最大,至于所采用的思想便是求数组的最大子序列,比如1,2,-1,-1,3,这个数组的最大和就是本身为4;再比如1,2,-1,-3,4,这个数组额度最大子序列为4,即最后一个数,那么在矩阵中通过将各行相加,并找出相加后的数组的最大子序列和,便得解,至于详细原理,请百度最大子矩阵;这里提供一份代码,若输入数据进行调试,一看就会明了,注释也会引导

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 int N;
     7 int a[101][101];//矩阵
     8 int dp[101];//
     9 
    10 int getMaxArray(int a[], int N) {//求数组的最大子序列的和返回
    11     int max = a[0], tmp = 0;
    12     for (int i = 0; i < N; ++i) {
    13         if (tmp > 0) {//子段的求法,比如说1,3,-5,4,3,tmp始终保持从前往后加是正数和的值,前面1,3,-5相加已经为-1,所以不可能和后面构成最大子段和了,此时的tmp要重新开始,因此tmp = a[i]
    14             tmp += a[i];
    15         } else {
    16             tmp = a[i];
    17         }
    18         max = max > tmp ? max : tmp;
    19     }
    20     return max;
    21 }
    22 
    23 int main() {
    24     while (scanf("%d", &N) != EOF) {
    25         for (int i = 0; i < N; ++i) {
    26             for (int j = 0; j < N; ++j) {
    27                 scanf("%d", &a[i][j]);
    28             }
    29         }//输入数组N*N
    30         int res = a[0][0], tmp;//默认为a[0][0];
    31         for (int i = 0; i < N; ++i) {//会做N次;
    32             memset(dp, 0, sizeof(dp));//每一次都会将dp数组清空为0
    33             for (int j = i; j < N; ++j) {
    34                 for (int k = 0; k < N; ++k) {//这里k从0到n-1,下面是dp[k],说明dp数组只用了n单元,恰恰getMaxArray的参数就是dp,和N这一点的确符合;说明????
    35                     dp[k] += a[j][k];
    36                 }
    37                 tmp = getMaxArray(dp, N);
    38                 res = res > tmp ? res : tmp;
    39             }
    40         }
    41         printf("%d
    ", res);
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    .NET实现Excel文件的读写 未测试
    权限管理设计
    struts1中配置应用
    POJ 2139 Six Degrees of Cowvin Bacon(floyd)
    POJ 1751 Highways
    POJ 1698 Alice's Chance
    POJ 1018 Communication System
    POJ 1050 To the Max
    POJ 1002 4873279
    POJ 3084 Panic Room
  • 原文地址:https://www.cnblogs.com/numen-fan/p/6504433.html
Copyright © 2011-2022 走看看