今晚ABC的E题怎么写(难道dp)

学术版

要不然呢
by piggy123 @ 2022-05-14 21:57:20


$dp[i][0/1]$ 第 $i$ 个选不选 ```cpp #include <bits/stdc++.h> #define int long long #pragma GCC optimize("-Ofast") using namespace std; const int NR = 3e6 + 5; int n, ans = 1e18, a[NR], f[NR][2]; signed main() { cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; memset(f, 0x3f, sizeof(f)); f[1][1] = a[1]; for (int i = 2; i <= n; ++i) { f[i][1] = min(f[i - 1][0], f[i - 1][1]) + a[i]; f[i][0] = f[i - 1][1]; } ans = min(ans, min(f[n][1], f[n][0])); memset(f, 0x3f, sizeof(f)); f[1][0] = 0; for (int i = 2; i <= n; ++i) { f[i][1] = min(f[i - 1][0], f[i - 1][1]) + a[i]; f[i][0] = f[i - 1][1]; } ans = min(ans, f[n][1]); cout << ans << endl; return 0; } ```
by rsg23 @ 2022-05-14 21:57:26


同求,一直 AC17 WA9,吃了 6 发罚时/fn/fn
by Kobe303 @ 2022-05-14 21:57:35


就是 DP,简单的环形 DP
by cancan123456 @ 2022-05-14 21:57:35


@[GIAOchen](/user/431658) E 的确是 dp。设 $f_{i,0}$ 表示不选第 $i$ 个时的最小值,$f_{i,1}$ 表示选第 $i$ 个时的最小值,则容易推出 $f_{i,0}=f_{i-1,1},f_{i,1}=\min\{f_{i-1,1},f_{i-1,0}\}+a_i$。 注意要考虑边界问题,并且因为第 $n$ 个数和第 $1$ 个数可能重复,要算以第 $n$ 个和第 $1$ 个开头两种情况。 ~~我被这个问题卡了大概 10min~~
by donghanwen1225 @ 2022-05-14 21:58:56


@[UnAccepting自动机](/user/448887) 我就是左右端点($1$ 和 $n$ )的边界没搞好
by LaDeX @ 2022-05-14 21:59:54


无语
by LaDeX @ 2022-05-14 22:00:06


这难道不是环形 DP 基本套路吗?
by cancan123456 @ 2022-05-14 22:06:54


|