//思路:二维DP,因为木板的高度只需与相邻俩边不同,所以只需枚举0,1,2的状态即可(俺是SB)
#include<bits/stdc++.h>
using namespace std;
typedef long long i64;
const int maxn = 3e5 + 32;
int a[maxn],b[maxn];
i64 dp[maxn][3];
int main()
{
ios::sync_with_stdio(false); cin.tie(0),cout.tie(0);
int T,n; cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i]>>b[i];
dp[i][0] = dp[i][1] = dp[i][2] = 0x3f3f3f3f3f3f3f3f;
}
dp[1][0] = 0,dp[1][1] = b[1],dp[1][2] = 2*b[1];
for(int i=2;i<=n;++i)
{
for(int j=0;j!=3;++j)
{// i - 1的花费
for(int k=0;k!=3;++k)
{
if(a[i-1]+j != a[i] + k)
{
dp[i][k] = min(dp[i][k],dp[i-1][j] + k*b[i]);
}
}
}
}
cout<<min(min(dp[n][0],dp[n][1]),dp[n][2])<<‘\n‘;
}
}
https://codeforces.com/contest/1221/problem/D
codeforces D. Make The Fence Great Again
原文:https://www.cnblogs.com/newstartCY/p/11624900.html