문제
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 < 0) return -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 |
'백준 알고리즘(C++)' 카테고리의 다른 글
백준 12852번 1로 만들기 2 ( C++ ) (0) | 2024.09.18 |
---|---|
백준 4811번 알약 ( C++ ) (0) | 2024.09.17 |
백준 1103번 게임 ( C++ ) (0) | 2024.09.15 |
백준 17070번 파이프 옮기기 1 ( C++ ) (0) | 2024.09.15 |
백준 2098번 외판원 순회 ( C++ ) (0) | 2024.09.15 |