小猫旅行吃鱼的最优方案 - 动态规划算法
小猫旅行吃鱼的最优方案 - 动态规划算法
明明带着心爱的小猫去旅行,一共要经过 n 个站点,从 1 号站点出发,依次经过 2、3……n 号站点。
由于小猫需要在每个站点吃一条鱼,除了 1 号站点只能吃当地买的鱼,其他站点既可以吃当地买的鱼,也可以吃之前经过的站点买的存入车载冰箱中的鱼。
但车载冰箱消耗的电能来自汽油,所以每条鱼用冰箱保存到下一站的费用与各个站点的汽油价格有关。
为了使问题简化,我们约定:
- 车从某站开出时油箱中都是此站点刚加的汽油。
- 车载冰箱能容纳一路上需要的所有鱼。
即:每条鱼的费用既包括购买时的费用,也包括用冰箱保存鱼的费用。
编程实现:
为了降低小猫吃鱼的总代价,明明预先上网查到了这 n 个站点的鱼价和汽油价格。并据此算出每个站点买一条鱼的费用以及从该站点到下一站用冰箱保存一条鱼的费用。你能帮明明算出这一路上小猫吃鱼的最小总费用吗?
输入描述
第一行:站点数 n,1<n<100。
接下来的 n 行:每行两个以空格分隔的正整数,表示:这一站买一条鱼的费用,以及从这一站把每条鱼保存到下一站的费用,两个费用均为小于 10000 的正整数。
输出描述
最小总费用,是一个正整数。
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> fishCost(n);
vector<int> fridgeCost(n);
for (int i = 0; i < n; i++) {
cin >> fishCost[i] >> fridgeCost[i];
}
vector<int> dp(n, numeric_limits<int>::max());
dp[0] = fishCost[0];
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
dp[i] = min(dp[i], dp[j] + fishCost[i] + fridgeCost[i] * (i - j));
}
}
cout << dp[n-1] << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/qzto 著作权归作者所有。请勿转载和采集!