martes, 17 de abril de 2012

10827 - Maximum sum on a torus, uva

#include<cstdio>
#include<cstring>
#include<iostream>
#define db(a) cout << #a << " = " << a << endl
#define db2(a, b) cout << #a << " = " << a << " " << #b << " = " << b << endl
#define db3(a, b, c) cout << #a << " = " << a << " " << #b << " = " << b << " " << #c << " = " << c << endl
using namespace std;
int main() {
 #ifdef dennisbot
 freopen("in.in", "r", stdin);
 //freopen("ou.out", "w", stdout);
 #endif
 int m ,n;
 scanf("%d", &m);
 while (m --) {
  scanf("%d", &n);
  int matriz[n][n], fila[n];
  for (int i = 0; i < n; i++) {
   for (int j = 0; j < n; j++) {
    scanf("%d", &matriz[i][j]);
   }
  }
  /*for (int i = 0; i < n; i++) {
   for (int j = 0; j < n; j++) {
    if (j != 0) cout << " ";
    cout << matriz[i][j];
   }
   cout << endl;
  }*/
  int sum = 0, sum_min = 0,total = 0, var, max = -1000, min = 1000;
  for (int i = 0; i < n; i++) {
   memset(fila, 0, sizeof fila);
   for (int ii = i; ii < i + n; ii++) {
    sum = sum_min = total = 0;
    min = 1000;
    for (int j = 0; j < n; j++) {
     fila[j] += matriz[ii % n][j];
     total += fila[j];
     if (sum >= 0) {
      sum += fila[j];
     }
     else sum = fila[j];
     if (sum_min <= 0) {
      sum_min += fila[j];
     }
     else sum_min = fila[j];
     if (sum > max) max = sum;
     if (sum_min < min) min = sum_min;
    }
    max = std::max(max, total - min);
   }
   
  }
  printf("%d\n", max);
 }
 return 0;
}

No hay comentarios:

Publicar un comentario