題目大意:
分析:
發現最後的答案就是
然後對於其中的一些連續的項需要乘上或者
如果,那麼也要
第項是,
設表示前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;
}