$O(nS)$
dp[i][j]: $1...i$ 번 블럭을 이용하여 $h_A-h_B=j$가 되도록 만들 때 $h_A$의 최댓값
#include<cstdio> #include<algorithm> using namespace std; const int MXD = 25e4; int n, dp[51][MXD * 2 + 1], a[51]; bool vis[51][MXD * 2 + 1]; int f(int h, int d) { if (!h || abs(d - MXD) > MXD) return d^MXD ? -1e9 : 0; if (!vis[h][d]) { vis[h][d] = 1; dp[h][d] = max({ f(h - 1, d - a[h]) + a[h], f(h - 1, d + a[h]),f(h - 1,d) }); } return dp[h][d]; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", a + i); int r = f(n, MXD); printf("%d", r ? r : -1); return 0; }
댓글 없음 :
댓글 쓰기