牛客网-最小花费【dp】

在这里插入图片描述
十分钟找出递推关系式,10分钟wa我可真是个憨憨 ,状态转移其实蛮明显的,

dp[i]为从a到第i个车站的最小花费

从起始位置a开始不断向前寻找,每次前向找到所有 l 3 距离\leq l3 的车站,更新到达他们的最小花费–还是看代码比较清晰

  • 注意,起点是a终点是b,别用1做起点N做终点。
  • 没有告知N的大小就很坑,使用vector比较保险。
#include<iostream>
#include<string>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
using namespace std;

#define ll int
#define MAX 1000005
#define inf 0x3fffff
#define mod 10000

int main() {
	ll l1, l2, l3, c1, c2, c3, a, b, n; 
	while (cin >> l1 >> l2 >> l3 >> c1 >> c2 >> c3) {
		cin >> a >> b >> n;
		vector<ll> v(n + 1), dp(n + 1);
		for (int i = 2; i <= n; i++)cin >> v[i], dp[i] = inf;
		dp[a] = 0;
		for (int i = a; i < n; i++) {
			//从i车站开始
			for (int j = i + 1; j <= n && v[j] - v[i] <= l3; j++) {
				if (v[j] - v[i] <= l1) { if (dp[i] + c1 < dp[j])dp[j] = dp[i] + c1; }
				else if (v[j] - v[i] <= l2) { if (dp[i] + c2 < dp[j])dp[j] = dp[i] + c2; }
				else if (v[j] - v[i] <= l3) { if (dp[i] + c3 < dp[j])dp[j] = dp[i] + c3; }
			}
		}
		cout << dp[b] << endl;
	}
}
发布了269 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105632288