这题我们发现其实是dp的状态机模型,虽然我们发现一个数字可以更改多次
但是我们只要求相邻的不同,所以一个数字最多只跳两次,因为这样就能保证相邻不同,越多没有意义且费钱
所以我们只需三个for循环就能转移
另外本题有几个注意点
1.数据范围很大,所以不能用cin
2.memset会超时,血的教训,在大量清空的情况下最好用for循环控制
3.会爆int,这个题目有显示。
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<map> #include<vector> using namespace std; typedef long long ll; const int mod=1e9+7; const int N=5e5+10; const ll inf=1e18+10; ll a[N],b[N]; ll f[N][3];//前i位当前位置修改几次 int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); int i; for(i=1;i<=n;i++){ scanf("%lld%lld",&a[i],&b[i]); } for(i=0;i<=n;i++){ for(int j=0;j<3;j++) f[i][j]=inf; } f[0][0]=0; int j,k; for(i=1;i<=n;i++){ for(k=0;k<3;k++){ for(j=0;j<3;j++){ if(a[i-1]+j!=a[i]+k){ f[i][k]=min(f[i-1][j]+k*b[i],f[i][k]); } } } } printf("%lld ",min(min(f[n][0],f[n][1]),f[n][2])); } }