█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

Envío 3909

Problema 0xa6 - Submatriz de suma máxima en una matriz no muy grande

  • Autor: bryancalisto
  • Fecha: 2021-04-21 04:22:42 UTC (Hace alrededor de 3 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.002 s 2 KBi
#2
Correcto
0.006 s 1 KBi
#3
Correcto
0.003 s 2 KBi
#4
Correcto
0.004 s 5 KBi
#5
Correcto
0.002 s 1 KBi
#6
Correcto
0.004 s 2 KBi
#7
Correcto
0.006 s 2 KBi
#8
Correcto
0.01 s 6 KBi
#9
Correcto
0.008 s 2 KBi
#10
Correcto
0.006 s 1 KBi
#11
Correcto
0.005 s 6 KBi
#12
Correcto
0.005 s 1 KBi
#13
Correcto
0.007 s 1 KBi
#14
Correcto
0.006 s 2 KBi
#15
Correcto
0.007 s 4 KBi
#16
Correcto
0.007 s 1 KBi
#17
Correcto
0.006 s 1 KBi
#18
Correcto
0.005 s 1 KBi
Puntos totales: 100 / 100

Código

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

int max(int a,int b){
  return a > b? a: b;
}

// Para encontrar valor de la mayor suma de los subarrays de un array en O(n)
int kadane(int *arr, int len)
{
  int sumaMax = -10000;
  int sumaActual = 0;

  for (int i = 0; i < len; i++)
  {
    sumaActual = max(arr[i], arr[i] + sumaActual);
    if (sumaActual > sumaMax)
    {
      sumaMax = sumaActual;
    }
  }

  return sumaMax;
}

int main()
{
  int i, j, k, l, R, C, *matriz, sumaMax = -10000, *tmp;

  // INPUT
  fscanf(stdin, "%d %d", &R, &C);
  matriz = (int *)malloc(sizeof(int) * R * C);

  for (i = 0; i < R; i++)
  {
    for (j = 0; j < C; j++)
    {
      fscanf(stdin, "%d", matriz + i * C + j);
    }
  }

  // ALGORITMO
  tmp = (int *)calloc(R * C, sizeof(int)); // matriz temporal

  for (i = 0; i < R; i++)
  {
    for (j = 0; j < C; j++)
    {
      if (j > 0)
      {
        *(tmp + i * C + j) = *(matriz + i * C + j) + *(tmp + i * C + j - 1);
      }
      else
      {
        *(tmp + i * C + j) = *(matriz + i * C + j);
      }
    }
  }

  int nums;
  for (i = 0; i < C; i++)
  {
    for (j = i; j < C; j++)
    {
      nums = 1;
      int *v = (int *)malloc(sizeof(int) * nums);
      for (k = 0; k < R; k++)
      {
        l = 0;
        if (i > 0)
        {
          l = *(tmp + k * C + j) - *(tmp + k * C + i - 1);
        }
        else
        {
          l = *(tmp + k * C + j);
        }

        v[nums - 1] = l;
        nums++;
        v = (int *)realloc(v, sizeof(int) * nums);
      }

      sumaMax = max(sumaMax, kadane(v, nums - 1));
      free(v);
    }
  }

  printf("%d\n", sumaMax);

  free(matriz);
  free(tmp);
  return 0;
}