f[i]表示从起点到第i个车站的最小费用

f[i] = min(f[j] + dist(i, j)), j < i

动规中设置起点为0,其他为正无穷

(貌似不用开long long也可以)

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

typedef long long ll;
const int MAXN = 112;
ll a[MAXN], l[4], c[4], f[MAXN];
int n, s, e;

ll dist(ll n, ll m)
{
	ll x = a[m] - a[n];
	if(0 < x && x <= l[1]) return c[1];
	if(l[1] < x && x <= l[2]) return c[2];
	if(l[2] < x && x <= l[3]) return c[3];
	return 2e9;
}

int main()
{
	REP(i, 1, 4) scanf("%lld", &l[i]);
	REP(i, 1, 4) scanf("%lld", &c[i]);
	scanf("%d%d%d", &n, &s, &e);
	if(s > e) swap(s, e);
	REP(i, 2, n + 1) scanf("%d", &a[i]), f[i] = 2e9;
	
	f[s] = 0;
	REP(i, s, e + 1)
		REP(j, s, i)
			f[i] = min(f[i], f[j] + dist(j, i));
	printf("%lld\n", f[e]);

	return 0;
}

 

相关文章:

  • 2021-08-21
  • 2021-08-28
  • 2021-08-01
  • 2021-12-30
  • 2021-12-08
  • 2021-10-22
猜你喜欢
  • 2022-03-09
  • 2021-09-24
  • 2021-06-03
  • 2021-09-07
  • 2021-11-10
  • 2021-11-04
  • 2022-03-10
相关资源
相似解决方案