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 }
  • 相关阅读:
    sql server还原数据库(请选择用于还原的备份集)
    初学K3Cloud开发
    SQL-视图
    2019-07-31 C#基础知识学习
    2019-07-30 C#基础知识学习
    初学数据库
    什么时候该使用SUM()函数
    Mongo Document 校验
    Linux Mysql操作命令
    说一说Unsafe魔法类
  • 原文地址:https://www.cnblogs.com/numen-fan/p/6504433.html
Copyright © 2011-2022 走看看