题目描述
样例
Sample Input 1
5
2 5 3 2 5
Sample Output 1
7
Sample Input 2
20
29 27 79 27 30 4 93 89 44 88 70 75 96 3 78 39 97 12 53 62
Sample Output 2
426
数据范围
代码
int f[N][2];
int g[N][2];
// f[i][0]: 当前i没有饱,i之前所需要的最小值
// f[i][1]: 当前i饱了,i之前所需要的最小值
// f[i][0] = f[i - 1][1]
// f[i][1] = min(f[i - 1][0] + a[i - 1], f[i - 1][1], a[i]); ×
// 向后转移,你会发现,前面饱了的,会带i饱
// 不好转移?
// f[i][0]: 当前不是自己喂饱,前i的总最小值
// f[i][1]: 当前是自己喂饱,前i的总最小值
// f[i][0] = f[i - 1][1];
// f[i][1] = min(f[i - 1][0], f[i - 1][1]) + a[i];
int a[N];
void solve() {
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
f[1][0] = 2e9, f[1][1] = a[1];
for (int i = 2; i <= n; i++) {
f[i][0] = f[i - 1][1];
f[i][1] = min(f[i - 1][0], f[i - 1][1]) + a[i];
}
g[1][0] = 2e9, g[1][1] = a[2];
for (int i = 2; i <= n; i++) {
g[i][0] = g[i - 1][1];
g[i][1] = min(g[i - 1][0], g[i - 1][1]) + a[i % n + 1];
}
cout << min(min(f[n][0], f[n][1]), min(g[n][0], g[n][1])) << endl;
}
signed main() {
IOS int _ = 1;
// cin >> _;
while(_--) { solve(); }
return 0;
}