rt,蒟蒻刚学DP,本来先想打个暴力再试着优化,但是却只AC#1,救救孩子吧
我设 Fi,0 为不在i修仓库的答案,Fi,1 为 在 i 修仓库的答案,我就推出来了Fi,1=min(Fi+1,0,Fi+1,1) , Fi,0=mini<j≤N(Fj,1+pi×(disj−disi))
然后就只过了样例,输入这篇帖子的Hack却输出7。。。
是我代码写错了还是方程推错了?QAQ
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+7;
LL N,dis[maxn],p[maxn],coin[maxn];
LL f[maxn][2];
int main(){
memset(f,0x7f,sizeof(f));
scanf("%lld",&N);
for(int i=1;i<=N;i++)
scanf("%lld%lld%lld",&dis[i],&p[i],&coin[i]);
f[N+1][0]=f[N+1][1]=0;
for(int i=N;i>=1;i--){
f[i][1]=min(f[i+1][0],f[i+1][1])+coin[i];
for(int j=N;j>i;j--)
f[i][0]=min(f[i][0],f[j][1]+p[i]*
(dis[j]-dis[i]));
}
printf("%lld",min(f[1][0],f[1][1]));
return 0;
}