1749번: 점수따먹기
동주는 항상 혼자 노느라 심심하다. 하지만 혼자 놀기의 고수가 된 동주는 매일매일 게임을 개발하여 혼자놀기의 진수를 우리에게 보여준다. 어느 날 동주는 새로운 게임을 개발하였다. 바로 점
www.acmicpc.net
문제
동주는 항상 혼자 노느라 심심하다. 하지만 혼자 놀기의 고수가 된 동주는 매일매일 게임을 개발하여 혼자놀기의 진수를 우리에게 보여준다. 어느 날 동주는 새로운 게임을 개발하였다. 바로 점수 따먹기라는 게임인데 그다지 재밌어 보이지는 않는다.
동주가 개발한 게임은 이렇다. 일단 N*M 행렬을 그린 다음, 각 칸에 -10,000 이상 10,000 이하의 정수를 하나씩 쓴다. 그런 다음 그 행렬의 부분행렬을 그려 그 안에 적힌 정수의 합을 구하는 게임이다.
동주가 혼자 재밌게 놀던 중 지나가는 당신을 보고 당신을 붙잡고 게임을 하자고 한다. 귀찮은 당신은 정수의 합이 최대가 되는 부분행렬을 구하여 빨리 동주에게서 벗어나고 싶다.
입력
첫째 줄에 N (1 < N < 200), M (1 < M < 200)이 주어진다. 그 다음 N개의 줄에 M개씩 행렬의 원소가 주어진다.
출력
첫째 줄에 최대의 합을 출력하라.
코드
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
ps = [[0]*(m+1) for _ in range(n+1)] # 누적합 저장 행렬
for i in range(1, n+1):
arr = list(map(int, input().split()))
for j in range(1, m+1):
ps[i][j] = ps[i-1][j] + ps[i][j-1] + arr[j-1] - ps[i-1][j-1]
ans = -int(1e9)
for x2 in range(1, n+1):
for y2 in range(1, m+1):
for x1 in range(1, x2+1):
for y1 in range(1, y2+1):
s = ps[x2][y2] - ps[x1-1][y2] - ps[x2][y1-1] + ps[x1-1][y1-1]
if s > ans:
ans = s
print(ans)
Python3로는 시간 초과가 발생하고...PyPy3로 통과 가능하다.
'문제풀이 > 누적합' 카테고리의 다른 글
[Python/파이썬] 백준 10986번 나머지 합 (0) | 2023.07.02 |
---|---|
[Python/파이썬] 백준 21758번 꿀 따기 (0) | 2023.05.24 |
[Python/파이썬] 백준 2015번 수들의 합 4 (0) | 2023.05.10 |
[Python/파이썬] 백준 15724번 주지수 (0) | 2023.04.12 |
[Python/파이썬] 백준 21318번 피아노 체조 (0) | 2023.03.24 |
1749번: 점수따먹기
동주는 항상 혼자 노느라 심심하다. 하지만 혼자 놀기의 고수가 된 동주는 매일매일 게임을 개발하여 혼자놀기의 진수를 우리에게 보여준다. 어느 날 동주는 새로운 게임을 개발하였다. 바로 점
www.acmicpc.net
문제
동주는 항상 혼자 노느라 심심하다. 하지만 혼자 놀기의 고수가 된 동주는 매일매일 게임을 개발하여 혼자놀기의 진수를 우리에게 보여준다. 어느 날 동주는 새로운 게임을 개발하였다. 바로 점수 따먹기라는 게임인데 그다지 재밌어 보이지는 않는다.
동주가 개발한 게임은 이렇다. 일단 N*M 행렬을 그린 다음, 각 칸에 -10,000 이상 10,000 이하의 정수를 하나씩 쓴다. 그런 다음 그 행렬의 부분행렬을 그려 그 안에 적힌 정수의 합을 구하는 게임이다.
동주가 혼자 재밌게 놀던 중 지나가는 당신을 보고 당신을 붙잡고 게임을 하자고 한다. 귀찮은 당신은 정수의 합이 최대가 되는 부분행렬을 구하여 빨리 동주에게서 벗어나고 싶다.
입력
첫째 줄에 N (1 < N < 200), M (1 < M < 200)이 주어진다. 그 다음 N개의 줄에 M개씩 행렬의 원소가 주어진다.
출력
첫째 줄에 최대의 합을 출력하라.
코드
import sys input = sys.stdin.readline n, m = map(int, input().split()) ps = [[0]*(m+1) for _ in range(n+1)] # 누적합 저장 행렬 for i in range(1, n+1): arr = list(map(int, input().split())) for j in range(1, m+1): ps[i][j] = ps[i-1][j] + ps[i][j-1] + arr[j-1] - ps[i-1][j-1] ans = -int(1e9) for x2 in range(1, n+1): for y2 in range(1, m+1): for x1 in range(1, x2+1): for y1 in range(1, y2+1): s = ps[x2][y2] - ps[x1-1][y2] - ps[x2][y1-1] + ps[x1-1][y1-1] if s > ans: ans = s print(ans)
Python3로는 시간 초과가 발생하고...PyPy3로 통과 가능하다.
'문제풀이 > 누적합' 카테고리의 다른 글
[Python/파이썬] 백준 10986번 나머지 합 (0) | 2023.07.02 |
---|---|
[Python/파이썬] 백준 21758번 꿀 따기 (0) | 2023.05.24 |
[Python/파이썬] 백준 2015번 수들의 합 4 (0) | 2023.05.10 |
[Python/파이썬] 백준 15724번 주지수 (0) | 2023.04.12 |
[Python/파이썬] 백준 21318번 피아노 체조 (0) | 2023.03.24 |