-
반응형
https://www.acmicpc.net/problem/2670
2670번: 연속부분최대곱
첫째 줄은 나열된 양의 실수들의 개수 N이 주어지고, 그 다음 줄부터 N개의 수가 한 줄에 하나씩 들어 있다. N은 10,000 이하의 자연수이다. 실수는 소수점 첫째자리까지 주어지며, 0.0보다 크거나
www.acmicpc.net
풀이
dp를 이용하여 문제를 해결했다.
먼저 dp[i][0]= i번째 원소를 포함하지 않는 현재까지의 최대곱을 의미하고, dp[i][1]= i번째 원소를 포함한 상태에서의 최대곱을 의미한다.
i번째 원소를 포함하지 않는 현재까지의 최대곱은, i-1번째를 포함했을때와 포함하지 않았을때의 최대곱중 더 큰값을 택하면된다.
=>dp[i][0]=max(dp[i-1][0],dp[i-1][1]
i번째 원소를 포함하는 경우는 두가지 경우이다. i-1번째원소와 연결이 된 경우, i번째 원소가 스타트인 경우 두가지 이므로, 두가지경우중 더 큰값을 택하면된다.
=>dp[i][1]=max(dp[i-1][1]+array[i],array[i]);
n번째 원소까지 위를 실행한 뒤, dp[n-1][0]과 dp[n-1][1]중 더 큰 값을 택하면 된다.
시간복잡도
한번의 탐색으로 끝나기때문에 O(N)이 된다.
코드
import java.util.Scanner; public class Main { static double[] array; static double[][] dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); array=new double[n]; dp=new double[n][2]; for (int i = 0; i < n; i++) { array[i] = sc.nextDouble(); } dp[0][0]=0; dp[0][1]=array[0]; for(int i=1;i<n;i++){ dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]); dp[i][1]=Math.max(dp[i-1][1]*array[i],array[i]); } String ret=String.format("%.3f",Math.max(dp[n-1][0],dp[n-1][1])); System.out.println(ret); sc.close(); } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 2920번 음계 (0) 2021.11.01 [백준OJ] 16943번 숫자 재배치 (0) 2021.10.28 [백준OJ] 11060번 점프 점프 (0) 2021.10.27 [백준OJ] 4256번 트리 (0) 2021.09.28 [백준OJ] 20366번 같이 눈사람 만들래? (0) 2021.09.27 댓글