공부공간

BOJ - 10211 ) Maximum Subarray 본문

알고리즘/Dynamic Programming

BOJ - 10211 ) Maximum Subarray

개발자가될수있을까? 2020. 11. 16. 22:57


www.acmicpc.net/problem/10211

 

10211번: Maximum Subarray

크기 N인 정수형 배열 X가 있을 때, X의 부분 배열(X의 연속한 일부분) 중 각 원소의 합이 가장 큰 부분 배열을 찾는 Maximum subarray problem(최대 부분배열 문제)은 컴퓨터 과학에서 매우 잘 알려져 있

www.acmicpc.net

 


수열에서 연속된 부분배열의 최댓값을 구하는 문제..

 

양수면 계속더하면 최댓값이 되지만 중간에 음수가있는경우,

 

음수의 덧셈으로 0보다 크면 계속 더해준다. N^2 / NlogN의 풀이도 있지만,

 

O(N)에 해결가능하다

 


package algorithm;

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

public class MaximumSubarray {

	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		StringBuilder sb = new StringBuilder();
		int n = Integer.parseInt(st.nextToken());
		for(int i=0 ; i < n ; i++) {
			st = new StringTokenizer(br.readLine());
			int t = Integer.parseInt(st.nextToken());
			int num[] = new int[t];
			st = new StringTokenizer(br.readLine());
			for(int ii=0;ii<t;ii++) {
				num[ii] = Integer.parseInt(st.nextToken());
			}
			int answer = -987654321;
			int dp[] = new int[t];
			dp[0] = num[0];
			for(int ii=1 ; ii<t; ii++) {
				dp[ii] = Math.max(dp[ii-1], 0) + num[ii];
				answer = answer > dp[ii] ? answer : dp[ii];
			}

			answer = answer > dp[0] ? answer : dp[0];
			sb.append(answer+"\n");
		}System.out.println(sb);
	}

}

'알고리즘 > Dynamic Programming' 카테고리의 다른 글

BOJ-17626 ) Four Squares  (0) 2022.03.02
BOJ - 15681 ) 트리와 쿼리  (0) 2021.07.26
BOJ - 1520 ) 내리막길  (0) 2020.08.27
BOJ - 9252 ) LCS 2  (0) 2020.08.25
BOJ - 9251 ) LCS  (0) 2020.08.25
Comments