题解:B4428 [CSP-X2025 山东] 勇者斗恶龙
wflengxuenong · · 题解
题目分析
对序列
对于第
因此,第
设
当某个
边界条件
我们要求最小值,所以
初始条件为
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+9;
typedef long long ll;
ll a[N],b[N],dp[N][3],n;//对当前数来说f[i][0/1]表示变了自己增加了多少,最多加2。
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
//可以分类讨论,感觉不如dp好写,dp可以无脑暴力枚举
memset(dp,0x3f,sizeof(dp)) ;
a[0]=-2e9;
dp[0][0]=dp[0][1]=dp[0][2]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
if(a[i]+j!=a[i-1]+k) dp[i][j]=min(dp[i][j],dp[i-1][k]+j*b[i]);
}
cout<<min(dp[n][0],min(dp[n][1],dp[n][2]));
}