这道题其实也分析出来了,就是dp[n][3]的一个空间,最多修2个单位长度,最少不修,状态转移其实不难,但是这道题做成了dp大讨论(哭)。
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[355555][3];
ll a[2102100];
ll b[2102100];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld %lld",a+i,b+i);
dp[i][0]=dp[i][1]=dp[i][2]=1e18;
}
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<=2;j++){
for(int k=0;k<=2;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(dp[n][2],min(dp[n][1],dp[n][0]))<<endl;
}
}