일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- array
- 악성코드
- OOP
- 투자
- C
- UTF-8
- HTML
- query
- 노드
- Call-by-reference
- API
- request
- c++
- WebProgramming
- 윈도우즈
- System
- beans
- JavaScript
- 포인터
- jsp
- Sort
- CLASS
- java
- Kafka
- 자료구조
- windows
- function
- CSS
- meta
- algorithm
- Today
- Total
hahahia
더블릿 문제풀이(최대 구간 구하기) 본문
예를 들어, 다음과 같은 값이 주어지면,
-2 9 2 -6 7 -7 5
최대 구간은 [9 2 -6 7]이며, 합은 12 이다.
입력
입력의 끝은 0 으로 인식한다.수의 개수는 2,000 개를 넘지 않는다.
출력
최대 구간의 합을 출력한다.입출력 예
입력
-2
9
2
-6
7
-7
5
0
출력
12
출처 | dovelet
대표적인 dynamic programming이라고 볼 수 있겠습니다..
이걸 모든 경우로 구하려고하면 엄청나게 시간소모가 될 꺼 같지만
적당한 점화식을 구해서 구해보면 적은 시간에 답을 뽑아낼 수 있겠죠......
dynamic programming이란 일부분의 답을 구해 하나씩 더해가 최종 답을 구하는(?) 그런
프로그래밍 기법이라고 볼 수 있습니다.
소스코드를 보시면 더 이해가 빠르실거에요.
main.cpp
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
int main()
{
int a[10000], dp[10000]={0};
int result, i, n;
for(i=0; ; i++){
cin >> a[i];
if(a[i]==0)
break;
}
n = i;
for( i = 0 ; i < n ; i++)
dp[i] = a[i] > a[i] + dp[i-1] ? a[i] : a[i] + dp[i-1];
result = dp[0];
for( i = 1 ; i <n ; i++)
if ( result < dp[i] ) result = dp[i];
cout << result << endl;
}
'Algorithm' 카테고리의 다른 글
binary search(이진 탐색) (0) | 2012.10.04 |
---|---|
c++ string을 이용한 2진수에서 10진수 변환 프로그램 (2) | 2012.10.04 |
쉬프트 연산( << , >> ) (0) | 2012.09.01 |
Selection Sort(선택 정렬) (2) | 2012.04.06 |
merge sort(병합 정렬) (0) | 2012.03.23 |