max_rect.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. '''
  2. > https://www.codingame.com/ide/1850615487c96262f26bd2d508cb46b18cc23557
  3. @author: olivier.massot, 2019
  4. '''
  5. import sys
  6. # w, h = [int(i) for i in input().split()]
  7. # rows = [[int(x) for x in input().split()] for _ in range(h)]
  8. w,h=2,2
  9. rows = [[99,0],
  10. [0,-1],
  11. [0,2],
  12. ]
  13. def max_subarray_1d(row):
  14. max_so_far, max_ending_here = 0, row[0]
  15. for v in row[1:]:
  16. max_ending_here = max(v, max_ending_here + v)
  17. max_so_far = max(max_so_far, max_ending_here)
  18. return max_so_far
  19. def max_subarray_2d(rows):
  20. w, h = len(rows[0]), len(rows)
  21. # Modify the array's elements to now hold the sum
  22. # of all the numbers that are above that element in its column
  23. summed=[[*row] for row in rows]
  24. for y in range(1, h):
  25. for x in range(w):
  26. summed[y][x] += summed[y-1][x]
  27. ans = 0
  28. for y0 in range(h-1):
  29. for y1 in range(y0+1, h):
  30. sums = [summed[y1][x] - summed[y0][x] for x in range(w)]
  31. ans = max(ans, max_subarray_1d(sums))
  32. for y in range(h):
  33. ans = max(ans, max_subarray_1d(summed[y]))
  34. ans = max(ans, max_subarray_1d(rows[y]))
  35. ans=max(ans, sum((sum(row) for row in rows)))
  36. return ans
  37. if all(v >= 0 for row in rows for v in row):
  38. print("special: all positives", file=sys.stderr)
  39. print(sum((sum(row) for row in rows)))
  40. elif all(v <= 0 for row in rows for v in row):
  41. print("special: all negatives", file=sys.stderr)
  42. print(max(max(row) for row in rows))
  43. elif len(rows[0]) == 1:
  44. print("special: one column", file=sys.stderr)
  45. maxsub = max_subarray_1d([row[0] for row in rows])
  46. print(maxsub)
  47. elif len(rows) == 1:
  48. print("special: one row", file=sys.stderr)
  49. maxsub = max_subarray_1d(rows[0])
  50. print(maxsub)
  51. else:
  52. maxsub = max_subarray_2d(rows)
  53. print(maxsub)