[DP] A Question of Ingestion gym101673G
阿新 • • 發佈:2018-11-22
#include <bits/stdc++.h> using namespace std; const int mn = 105; int l[mn], p[mn]; int dp[mn][mn]; int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &l[i]); p[1] = m; for (int i = 2; i <= n; i++) // 連續第 i 天的進食量 p[i] = p[i - 1] * 2 / 3; // dp[i][j] 第i天進食量為j時的最大答案 dp[1][0] = 0; dp[1][1] = min(p[1], l[1]); dp[2][0] = max(dp[1][0], dp[1][1]); dp[2][1] = min(p[1], l[2]); dp[2][2] = dp[1][1] + min(p[2], l[2]); for (int i = 3; i <= n; i++) { for (int j = 0; j <= i; j++) { int a = dp[i - 1][max(j - 1, 0)] + min(p[j], l[i]); // 不餓 連續吃到 j int b = dp[i - 2][j] + min(p[j], l[i]); // 餓一天 前天是 j dp[i][j] = max(a, b); } // 餓兩天 int ma = 0; for (int j = 0; j <= i - 3; j++) ma = max(ma, dp[i - 3][j]); dp[i][1] = max(dp[i][1], ma + min(p[1], l[i])); } int ans = 0; for (int j = 0; j <= n; j++) ans = max(ans, dp[n][j]); printf("%d\n", ans); return 0; }