백준 알고리즘(C++)

백준 2240번 자두나무 ( C++ )

coding232624 2024. 9. 17. 10:47

문제

https://www.acmicpc.net/problem/2240

 

해설

경우의수가 너무 커서 dp로 해결

-1로 초기화 할 경우 ~ret을 사용하면 -1일때만 false를 반환하도록할 수 있음

 

코드

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
#include<iostream>
#include<algorithm>
#include<cstring>
 
using namespace std;
 
int t,w,dp[1004][2][34], mv[1004];
 
int go(int idx, int location, int cnt){
  if(cnt < 0return -10000;
  if(idx >= t) return 0;
  int &ret = dp[idx][location][cnt];
  if(~ret) return ret;
  return ret = max(go(idx+1,location,cnt),go(idx+1,1^location,cnt-1)) +  ((location + 1== mv[idx] ? 1 : 0);
}
 
int main(){
  cin >> t >> w;
  for(int i=0;i<t;i++){
    cin >> mv[i];
  }
  memset(dp,-1,sizeof(dp));
 
  cout << max(go(0,0,w),go(0,1,w-1));
}
cs