백준/출제한 문제들

[백준] 33561번 : 임스의 땅따먹기

lms0806 2025. 6. 7. 11:56
728x90

https://www.acmicpc.net/problem/33561

 

해당 문제는 원래 친구와 1:1하는 컨셉으로 만들었으나, 문제를 만들다보니 대결구도가 필요없다는 것이 확인되어 수정되었습니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(br.readLine());
		
		int[][] num = new int[n + 1][n + 1], dp = new int[n + 1][n + 1], check = new int[n + 1][n + 1];
		for(int i = 1; i <= n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j = 1; j <= n; j++) {
				dp[i][j] = num[i][j] = st.nextToken().charAt(0) - '0';
				
				check[i][j] = num[i][j] == 0 ? 1 : 0;
			}
		}
		
		int k = Integer.parseInt(br.readLine());
		
		int[] arr = new int[k];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0; i < k; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr);
		
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= n; j++) {
				dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
				check[i][j] += check[i - 1][j] + check[i][j - 1] - check[i - 1][j - 1];
			}
		}
		
		long[] arr2 = new long[k + 1];
        for (int i = k - 1, j = 1; i >= 0; i--, j++) {
            arr2[j] = arr2[j - 1] + arr[i];
        }
		
		long answer = 0;
		for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                int maxLen = Math.min(n - i + 1, n - j + 1);
                for (int len = 1; len <= maxLen; len++) {
                    int nx = i + len - 1, ny = j + len - 1;
                    int zeroCnt = getSum(check, i, j, nx, ny);
                    if (zeroCnt > k) {
                    	continue;
                    }
                    
                    answer = Math.max(answer, getSum(dp, i, j, nx, ny) + arr2[zeroCnt]);
                }
            }
        }
		System.out.print(answer);
	}
	
	static int getSum(int[][] psum, int x1, int y1, int x2, int y2) {
        return psum[x2][y2] - psum[x1 - 1][y2] - psum[x2][y1 - 1] + psum[x1 - 1][y1 - 1];
    }
}
728x90