AcWing 3394. 最小花费(DP+暴搜)
原题链接
简单
作者:
wooxee
,
2025-01-06 11:11:38
,
所有人可见
,
阅读 5
题目分析
- f[]数组表示,从a站上车,到达某车站的最小花费;
- 第一层循环遍历从a+1到b的车站,求出每个车站的最小花费。
- 而对于某一车站i,其最小花费=前面某一车站的最小花费+该车站到车站i的花费(距离不大于L3)其中的最小值
- 故第二层循环遍历从a到i-1的车站(即当前车站之前的所有车站,当然了,由于从a上车,故在a前面的不用管)。
- 两层遍历,时间复杂度$O(n^2)$。由于车站只有n=1000个,所以$O(n^2)$的复杂度是可以的;
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int l1, l2, l3, c1, c2, c3;
int a, b, n;
int d[N];
int f[N];
int main()
{
cin >> l1 >> l2 >> l3 >> c1 >> c2 >> c3 >> a >> b >> n;
for (int i = 2; i <= n; i ++ )
cin >> d[i];
memset(f, 0x3f, sizeof f);
f[a] = 0;
for (int i = a + 1; i <= b; i ++ )
{
for (int j = a; j < i; j ++ )
{
int dd = d[i] - d[j];
if (dd <= l1) f[i] = min(f[i], f[j] + c1);
else if (dd <= l2) f[i] = min(f[i], f[j] + c2);
else if (dd <= l3) f[i] = min(f[i], f[j] + c3);
}
}
cout << f[b] << endl;
return 0;
}