연속합 문제를 풀때 맨 처음에 생각한 방법은 DFS로 각각의 경우를 모두 구해서 합을 구하는 방식으로 구현하였습니다.
하지만, 4%쯤 되서 시간초과가 발생하는 불상사가 생기게 되었습니다. 문제를 다시 읽어보니 N의 제한이 n(1 ≤ n ≤ 100,000) 까지 였기때문에 1초에 10억번연산을 수행해야하는 경우가 생길 수 있다고 판단하였습니다.
따라서, DFS로 구현하기에는 복잡도 면에서 무리가 있다고 생각하여 메모이제이션(DP)를 이용하였습니다.
테스트 케이스를 잘 살펴보면 이전의 합이 음수일때는 가장 큰값을 구할 수가 없습니다. 그리고, (이전의 합 + 현재의 합)이 음수일 경우도 최댓값을 구할 수가 없습니다.
publicclass 연속합1912DP{ staticint[] dp; staticint n; publicstaticvoidmain(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); dp = newint[n]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); for(int i=0; i<n; i++){ dp[i] = Integer.parseInt(st.nextToken()); }
int max = dp[0]; for(int i=1; i<n; i++){ if(dp[i] + dp[i-1] > 0 && dp[i-1] > 0){ dp[i] = dp[i-1] + dp[i]; } if(max < dp[i]){ max = dp[i]; } } /* 첫번째 경우 dp[i-1] > 0 이전의 합이 음수라면 선택하지 않습니다. 두번째 경우 dp[i] + dp[i-1] > 0 이전의 합과 현재의 수를 더한 값이 음수라면 선택하지 않습니다. */ System.out.println(max);