Koder / 박성훈
article thumbnail

무난한 dp 문제였다

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

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

dp문제를 쬐끔 풀어보면서 느낀게 있다면,

입력배열에서 모든걸 처리하려면 골치아프다는것이다.

그냥 dp배열 하나 더 만들자 ㅎㅎ

 

#include <stdio.h>

int input[100001] = {0};
int dp[100001] = {0};

int max(int a, int b){ return a>b?a:b; }

int main(){
	int n,value = -1234;
	
	scanf("%d", &n);
	for(int i=0; i<n; i++) scanf("%d", &input[i]);
	
	dp[0] = input[0];
	for(int i=0; i<n; i++){
		dp[i+1] = max(dp[i]+input[i+1], input[i+1]);
	}
	
	for(int i=0; i<n; i++) value = max(value, dp[i]);
	printf("%d", value);
	return 0;
}

dp[k]를 index[k] 숫자를 선택할때의 최대값으로 정했다.

아무것도 선택하지 않을수는 없으므로 dp[0]은 input[0]이기에 먼저 한줄 써줬고,

dp[i+1]는 i+1이라는 숫자를 선택했을 때이다.

이때 ( i를 선택했을때의 최대값 )인 dp[i] 의 값이 만약 양수라면 선택해주는게 최대값을 만들어낼 수 있을 것이고,

음수라면 그냥 input[i+1]만 선택해주는게 좋다.

그래서 둘중 큰 수를 반환하는 max함수를 간단히 작성해서 비교해주었다.

for문 한번 돌려서 최대값을 value변수에 담아주고,

출력만 하면 AC.

반응형