Comet OJ - Contest #8C 符文能量___dp

題目大意:

在這裏插入圖片描述

分析:

發現最後的答案就是b1a2+b2a3++bn1anb_1*a_2+b_2*a_3+……+b_{n-1}*a_n
然後對於其中的一些連續的項需要乘上kk或者k2k^2
如果aika_i*k,那麼bib_i也要k*k
ii項是biai+1b_i*a_{i+1}
dpi,0,0dp_{i,0,0}表示前i項中,當前項中bi,ai+1b_i,a_{i+1}都沒有進行k*k操作,前面也沒有進行k*k操作時的最小合併代價
dpi,0,1dp_{i,0,1}表示前i項中,當前項中bi,ai+1b_i,a_{i+1}都沒有進行k*k操作,前面進行了k*k操作時的最小合併代價
dpi,1,1dp_{i,1,1}表示前i項中,當前項中bib_i進行了k*k操作的最小合併代價
dpi,2,1dp_{i,2,1}表示前i項中,當前項中ai+1a_{i+1}進行了k*k操作的最小合併代價
dpi,3,1dp_{i,3,1}表示前i項中,當前項中bi,ai+1b_i,a_{i+1}進行了k*k操作的最小合併代價
轉移顯然

代碼:

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章