BOJ 2240 : 자두나무

2020. 6. 1. 01:28PS/DP

이 문제는 DP로 해결할 수 있다.

 

dp[i][j][k] = i초에 j번 움직이고 k번 나무에 있을 때 최적해

 

로 두고 풀면 된다.

#include <bits/stdc++.h>
#define sanic ios_base::sync_with_stdio(0);
#define MEM 1002
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
const ll MOD = 1e9+7;
ll t,n,m,ans;
ll dp[MEM][MEM][3];
ll ja[MEM];
main()
{
    sanic; cin.tie(0);
    cin >> n >> m;
    for(int i=1; i<=n; i++)
        cin >> ja[i];

    for(int i=1; i<=n; i++){
        dp[i][0][1] = dp[i-1][0][1] + (ja[i]==1);
        for(int j=1; j<=m; j++){
            if(i<j) continue;
            dp[i][j][1] = max(dp[i-1][j-1][2], dp[i-1][j][1]) + (ja[i]==1);
            dp[i][j][2] = max(dp[i-1][j-1][1], dp[i-1][j][2]) + (ja[i]==2);
            ans = max(ans, max(dp[i][j][1], dp[i][j][2]));
        }
    }
    cout << ans;
}

'PS > DP' 카테고리의 다른 글

BOJ 14728 : 벼락치기  (0) 2021.01.10
BOJ 2688 : 줄어들지 않아  (0) 2020.08.17
BOJ 17623 : 괄호  (0) 2020.08.17
BOJ 3056 : 007  (0) 2020.08.13
BOJ 18244 : 변형 계단 수  (0) 2020.05.29