题意:
t组,每次给n个篱笆,下面n行给出每个篱笆的初始高度和每次高度++的cost,问你要使相邻的篱笆高度都不一样且只能对篱笆每次++的最小cost。
思路:
初始化inf
dp[i][j]——当前到第i个 这个位置+j
dp[i][j] = min(dp[i][j],dp[i - 1][k] + b[i] * j); dp[i][j]是从dp[i - 1][0 ~ 2]在保证相邻不相同的situation下转化来的。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int MaxN = 3e5 + 5;
typedef long long LL;
const LL inf = 0x3f3f3f3f3f3f3f3f;
int t,n;
LL a[MaxN],b[MaxN];
LL dp[MaxN][4];
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 1;i <= n; i++){
scanf("%lld %lld",&a[i],&b[i]);
}
for(int i = 1;i <= n; i++){
for(int j = 0;j < 4; j++){
dp[i][j] = inf;
}
}
for(int i = 1;i <= n; i++){
for(int j = 0;j < 3; j++){//第i位+j
int cur = a[i] - a[i - 1] + j;//当前与上一个原本的高度差
for(int k = 0;k < 3; k++){//上一个已经是+k
if(cur == k) continue;
//我现在+j造成的结果是比原来的大k 上一个+k那就相邻相等了
dp[i][j] = min(dp[i][j],dp[i - 1][k] + j * b[i]);
}
}
}
printf("%lld\n",min(min(dp[n][0],dp[n][1]),dp[n][2]));
}
}