More actions
({CREATE}) |
No edit summary |
||
| Line 42: | Line 42: | ||
} | } | ||
== 박인서 == | == 박인서 == | ||
#include <iostream> | |||
#include <vector> | |||
#include <algorithm> | |||
std::vector<int> dp[2], st; | |||
int main() { | |||
int n; | |||
std::cin >> n; | |||
for (int i = 0; i < n; i++) { | |||
int t; | |||
std::cin >> t; | |||
st.push_back(t); | |||
} | |||
dp[0].push_back(0); | |||
dp[0].push_back(st[1]); | |||
dp[1].push_back(st[0]); | |||
dp[1].push_back(st[0] + st[1]); | |||
for (int i = 2; i < n; i++) { | |||
dp[0].push_back(std::max(dp[0][i - 2], dp[1][i - 2]) + st[i]); | |||
dp[1].push_back(dp[0][i - 1] + st[i]); | |||
} | |||
std::cout << std::max(dp[0][n - 1], dp[1][n - 1]); | |||
return 0; | |||
} | |||
== 곽정흠 == | == 곽정흠 == | ||
| Line 52: | Line 80: | ||
* 2번 밟은 상태는 밑 계단에서 1계단 오른 것입니다. 이는 3번 연속 밟는 것과 상관이 있으므로 밑 계단에서 1번 밟은 상태의 값에 현 계단의 값을 더하여 2번 밟은 상태에 저장합니다. | * 2번 밟은 상태는 밑 계단에서 1계단 오른 것입니다. 이는 3번 연속 밟는 것과 상관이 있으므로 밑 계단에서 1번 밟은 상태의 값에 현 계단의 값을 더하여 2번 밟은 상태에 저장합니다. | ||
* 이를 반복하여 끝 계단의 1번 밟은 상태와 2번 밟은 상태의 값 중 큰 값을 출력합니다. | * 이를 반복하여 끝 계단의 1번 밟은 상태와 2번 밟은 상태의 값 중 큰 값을 출력합니다. | ||
== 박인서 == | == 박인서 == | ||
* Dynamic Programming | |||
* dp[j][i] - i번째 계단까지 오르는데 그 직전에 밑계단에서 올라왔다면 j=1, 아니면 j=0이다. | |||
* dp[0][i]=max(dp[0][i-2],dp[1][i-2])+st[i] | |||
* dp[1][i]=dp[1][i-1]+st[i] | |||
== 곽정흠 == | == 곽정흠 == | ||
Revision as of 03:33, 28 September 2016
오늘의 문제
참가자
- 15이원준
코드
15이원준
#include<iostream>
#include<algorithm>
using namespace std;
int N;
int arr[301] = { 0, };
int dp[301][3] = { 0, };
int main(){
cin>> N;
for(int i = 1; i<=N; i++){
scanf("%d", &arr[i]);
}
if(N < 3){
int ans = 0;
for(int i = 1; i<=N; i++){
ans += arr[i];
}
cout<< ans << endl;
return 0;
}
dp[1][1] = arr[1];
dp[2][1] = arr[2];
dp[2][2] = dp[1][1] + arr[2];
for(int i = 3; i<=N; i++){
dp[i][1] = max(dp[i-2][1], dp[i-2][2]) + arr[i];
dp[i][2] = dp[i-1][1] + arr[i];
}
int ans = 0;
ans = max(dp[N][2] , dp[N][1]);
cout<< ans <<endl;
}
박인서
#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> dp[2], st;
int main() {
int n;
std::cin >> n;
for (int i = 0; i < n; i++) {
int t;
std::cin >> t;
st.push_back(t);
}
dp[0].push_back(0);
dp[0].push_back(st[1]);
dp[1].push_back(st[0]);
dp[1].push_back(st[0] + st[1]);
for (int i = 2; i < n; i++) {
dp[0].push_back(std::max(dp[0][i - 2], dp[1][i - 2]) + st[i]);
dp[1].push_back(dp[0][i - 1] + st[i]);
}
std::cout << std::max(dp[0][n - 1], dp[1][n - 1]);
return 0;
}
곽정흠
아이디어
15이원준
- dp를 이용하여 풀었습니다.
- 각 계단의 상태는 연속해서 1번 밟은 상태이거나 2번 밟은 상태일 수있습니다.
- 1번 밟은 상태는 밑밑 계단에서 2계단 오른 것입니다. 이는 3번연속 밟는 것과 상관이 없으므로 밑밑 계단에서 두 상태 중 더 큰 값을 갖는 것을 가져와 현 계단의 값을 더여 1번 밟은 상태에 저장합니다.
- 2번 밟은 상태는 밑 계단에서 1계단 오른 것입니다. 이는 3번 연속 밟는 것과 상관이 있으므로 밑 계단에서 1번 밟은 상태의 값에 현 계단의 값을 더하여 2번 밟은 상태에 저장합니다.
- 이를 반복하여 끝 계단의 1번 밟은 상태와 2번 밟은 상태의 값 중 큰 값을 출력합니다.
박인서
- Dynamic Programming
- dp[j][i] - i번째 계단까지 오르는데 그 직전에 밑계단에서 올라왔다면 j=1, 아니면 j=0이다.
- dp[0][i]=max(dp[0][i-2],dp[1][i-2])+st[i]
- dp[1][i]=dp[1][i-1]+st[i]