求助状态转移方程式
查看原帖
求助状态转移方程式
754467
f_hxr_楼主2024/1/20 21:40

rt,蒟蒻刚学DP,本来先想打个暴力再试着优化,但是却只AC#1,救救孩子吧

我设 Fi,0F_{i,0} 为不在i修仓库的答案,Fi,1F_{i,1} 为 在 i 修仓库的答案,我就推出来了Fi,1=min⁡(Fi+1,0,Fi+1,1)F_{i,1}=\min(F_{i+1,0},F_{i+1,1}) , Fi,0=min⁡i<j≤N(Fj,1+pi×(disj−disi))F_{i,0}=\min_{i<j \le N}(F_{j,1}+p_i \times (dis_j-dis_i))

然后就只过了样例,输入这篇帖子的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;
}
2024/1/20 21:40
加载中...