Koder / 박성훈
article thumbnail

부분합 배열 만들어서 해결했다.

부분합 배열을 만들지 않는 O(T*N^3) 풀이로도 풀 수 있다고 한다.

내가 구현한 코드의 시간복잡도는 O(T*N^2)

 

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

 

10211번: Maximum Subarray

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

www.acmicpc.net

부분합 배열을 미리 계산해놓고 답을 구하는데,

이때 sum[e] - sum[s] 를 통해 값을 구할 때

e와 s가 같아지는, 즉 아무것도 더하지 않아서 subarray의 길이가 0이 되는 경우는

포함시키면 안되니 이부분만 좀 신경을 써주면 되지 싶다.

 

#include <bits/stdc++.h>
using namespace std;

int main(){
	cin.sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int T;
	cin >> T;
	while(T--){
		int N;
		int ans = -998244353;
		int arr[1234] = {0};
		int sum[1234] = {0};
		
		cin >> N;
		for(int i=1; i<=N; i++){
			cin >> arr[i];
			sum[i] = arr[i]+sum[i-1];
		}
		
		for(int i=0; i<=N; i++){
			for(int j=i+1; j<=N; j++){
				ans = max(ans, sum[j]-sum[i]);
			}
		}
		
		cout << ans << "\n";
	}
	
	return 0;
}
반응형