티스토리 뷰

#include <stdio.h>

int main(void)
{
	int n;
	scanf("%d", &n);
	
	int arr[n];
	for(int i=0; i<n; i++) scanf("%d", &arr[i]);
	
	int one=0, zero=0, max = -1e9, tmp;
	for(int i=0; i<n; i++)
	{
		scanf("%d", &tmp);
		if(tmp) {
			one += arr[i];
			zero -= arr[i];	
			if(max < -1*arr[i]) max = -1*arr[i];
		} else {
			zero += arr[i];
			if(zero < arr[i]) zero = arr[i];
			if(max < zero) max = zero;
		}
	}
	printf("%d", one+max);
}

풀이 : dp

 

변수 설명

one : 켜져있는 전구들의 가치의 합

zero : 켜져있는 전구들의 경우 가치 * -1 을 누적, 꺼져있는 전구들의 경우 가치 를 누적

          단 여러 전구의 가치를 누적 한 것보다, 단 하나의 전구의 가치가 더 큰 경우 이걸로 변경한다.

max : 하나 이상의 전구를 변환할 때 얻을 수 있는 가장 큰 값

          전구가 다 켜져있는 경우를 대비해서, 전구들 중 가장 가치가 작은 것을 max에 대입해야 하며,

          꺼져 있는 전구를 다룰 때는, zero 가 max보다 크면 max에 zero을 대입해 주면 됩니다.

 

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

 

25634번: 전구 상태 뒤집기

$N$개의 전구가 일렬로 세워져 있다. 전구는 켜져 있을 수도 있고 꺼져 있을 수도 있다. 만약 $i$번째 전구가 켜져 있다면 그 전구의 밝기는 $a_i$이다. 연우는 $N$개의 전구 중 연속한 전구를 한 개

www.acmicpc.net

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함