题目描述
样例
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; }