심심해서 몇문제 풀었다.
이번 문제는 dp. 예전에 for문으로 한번 풀어보았기에 이번에는 재귀함수로 풀어보았다.
#include<iostream>
using namespace std;
int arr[301];
int dp[301];
int stair(int n){
if(n==0){
dp[0]=arr[0];
return dp[0];
}
else if(n==1){
dp[1]=arr[0]+arr[1];
return dp[1];
}
else if(n==2){
dp[2]= max(arr[0]+arr[2], arr[1]+arr[2]);//두 칸 중에서 더 큰 경우
return dp[2];
}
if(dp[n]!=0){
return dp[n];
}
return dp[n]=max(stair(n-3)+arr[n-1]+arr[n], stair(n-2)+arr[n]);
}
int main(){
int n;
cin>>n;
for(int i=0; i<n; i++){
cin>>arr[i];
}
cout<<stair(n-1);
}
핵심은 기억하며 더해주기. 이미 계산한 dp값에 대해서는 재귀연산을 하지 않는 것이다.

'알고리즘' 카테고리의 다른 글
| Boj 23250 c++ 하노이 탑 K (0) | 2025.06.16 |
|---|---|
| Boj 11729 c++ 하노이의 탑 이동순서 (0) | 2025.06.16 |
| Boj 2468 c++ 안전 영역 (1) | 2025.06.04 |
| Boj 1012 c++ 유기농 배추(feat: 연결 요소의 개수) (0) | 2025.06.03 |
| Boj 1620 c++ 나는야 포켓몬 마스터 이다솜 (0) | 2025.06.03 |