题目大意:
分析:
发现最后的答案就是
然后对于其中的一些连续的项需要乘上或者
如果,那么也要
第项是,
设表示前i项中,当前项中都没有进行操作,前面也没有进行操作时的最小合并代价
设表示前i项中,当前项中都没有进行操作,前面进行了操作时的最小合并代价
表示前i项中,当前项中进行了操作的最小合并代价
表示前i项中,当前项中进行了操作的最小合并代价
表示前i项中,当前项中进行了操作的最小合并代价
转移显然
代码:
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define N 100005
using namespace std;
typedef long long ll;
ll dp[N][4][2], a[N], b[N], ans, k;
int n;
int main() {
scanf("%d %lld", &n, &k);
for (int i = 1; i <= n; i++) scanf("%lld %lld", &a[i], &b[i]);
dp[1][0][0] = b[1] * a[2];
dp[1][0][1] = inf;
dp[1][1][1] = b[1] * k * a[2];
dp[1][2][1] = b[1] * a[2] * k;
dp[1][3][1] = b[1] * k * a[2] * k;
for (int i = 2; i < n; i++) {
dp[i][0][0] = dp[i - 1][0][0] + b[i] * a[i + 1];
dp[i][0][1] = min(dp[i - 1][1][1], dp[i - 1][0][1]) + b[i] * a[i + 1];
dp[i][1][1] = min(dp[i - 1][2][1], dp[i - 1][3][1]) + b[i] * k * a[i + 1];
dp[i][2][1] = dp[i - 1][0][0] + b[i] * a[i + 1] * k;
dp[i][3][1] = min(dp[i - 1][2][1], dp[i - 1][3][1]) + b[i] * k * a[i + 1] * k;
}
ans = min(min(dp[n - 1][0][0], min(dp[n - 1][0][1], dp[n - 1][1][1])), min(dp[n - 1][2][1], dp[n - 1][3][1]));
printf("%lld\n", ans);
return 0;
}
来源:https://blog.csdn.net/Gx_Man_VIP/article/details/99232581