며칠전에 시도했다 포기했던 문제를 다시 고민해봤다.
처음 생각했던 방법은 배열 f를 하나 선언하고,
i번째에서 조건에 따라 i+1번째와 i+2번째 값을 업데이트 하는 방식이었다.
이 방법으로 특정 케이스들은 해결했지만 계속 오류가 나서 다시 방법을 찾았다.
이번학기 알고리즘 수업에서 Dynamic Programing을 배울 때 스케줄링 문제를 접한 적이 있는데 그때와 비슷하게 구성해야겠다고 생각해서, 각 계단에서 케이스를
1. 연속으로 2번 1칸씩 온 경우
2. 1칸씩 온 경우
3. 2칸으씩 온 경우
로 케이스를 나누고, 각각 조건에 맞게 업데이트 해주는 방식으로 해결하였다.
뭔가 될 듯 말듯 않돼서 계속 하루 종일 붙잡고 있었다. 처음에 될 것 같은 아이디어가 떠오르면 거기에 너무 집착하게 되는 것 같다. 좀 더 명확한 방법을 생각하려고 노력해야겠다.
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n, m;
cin>>n;
vector<int> scores;
for(int i=0; i<n; i++){
cin>>m;
scores.push_back(m);
}
int f1[n] ={0};
int f2[n] ={0};
int f3[n] ={0};
f1[0] = scores[0];
f2[0] = scores[0];
f3[0] = 0;
for(int i=1; i<n; i++){
f1[i] = f2[i-1] + scores[i];
f2[i] = f3[i-1] + scores[i];
f3[i] = max(f1[i-1],f2[i-1]);
}
int answer = max(f1[n-1],f2[n-1]);
cout<<answer;
}