计算首站到末站最小费用
生活随笔
收集整理的這篇文章主要介紹了
计算首站到末站最小费用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
? 問題描述
長江游艇俱樂部在長江上設置了n個游艇出租站1,2,…,n。游客可在這些游艇出租站租用游艇,并在下游的任何一個游艇出租站歸還游艇。游艇出租站i到游艇出租站j之間的租金為r(i,j),1?i<j?n。試設計一個算法,計算出從游艇出租站1到游艇出租站n所需的最少租金。計算從首站到末站的最小費用
第一行數字表示有n個站點
后邊的第x行第y列的數字表示從第x站到第x+y站的費率
輸入文件示例 輸出文件示例
input.txt output.txt
3
5 15 12
7
input.txt output.txt
4 15
3 7 19
5 13
8*/#include<iostream>
#include<fstream>
#include<string>using namespace std;
//在測試條件下最大值設置為6已經夠用
//也可以更大
const int max = 6;//參數begin、end代表索引(index),從0開始而非從1開始
//參數begin、end分別為要求解的起始站點和最終站點的索引
//使用dp[x][y]存儲從x到y的最小費用
//使用port[x][y]存儲題目給出的直接從x到y的價格,
//實際上dp與port都只用了一個三角矩陣,但為了方便還是分配整個矩陣的空間
//返回值僅對于最上層的調用有意義,內部的遞歸調用的返回值沒有用處
//事實上也可以不要返回值,因為返回值就在dp[begin][end]中,可以取出
int solve(int dp[max][max], int port[max][max], int end, int begin) {//臨時變量,為了VC中調試時鼠標指上去觀察數值,實際上可以不要int ret = -1;//從站點出發到自身,不花錢,記錄在dp中if (begin == end) {dp[begin][end] = 0;ret = dp[begin][end];return 0;}//如果兩站相鄰,則直接到達的費用就是最小費用,記錄在dp中else if (begin == end - 1) {dp[begin][end] = port[begin][end];ret = dp[begin][end];return dp[begin][end];}//如果兩站相隔較遠,則比較麻煩//出發站到末站的最小費用是直接到達和經過其他站轉到的各種情況的費用中最小的那個//A到D的最小費用為min(A到B的最小費用+B到D的最小費用,//A直接到C 的最小費用+C到D的最小費用,A直接到D的最小費用)else if (end - begin > 1) {int min = port[begin][end]; //直接到達的費用總是已知的//用一個循環遍歷查找最小值for (int i = 1; i < end - begin; i++) {//如果中轉站到末站的費用還是未知,則先遞歸算出來再使用if (dp[begin + i][end] == -1) {solve(dp, port, end, begin + i);}//如果起始站到中轉站的費用還是未知,則先遞歸算出來再使用if (dp[begin][begin + i] == -1) {solve(dp, port, begin + i, begin);}//如果到某個中轉站的費用更小,則把最小值更新為這個費用if (min > dp[begin + i][end] + dp[begin][begin + i]) {min = dp[begin + i][end] + dp[begin][begin + i];}}//把最小費用填入表格,以供使用dp[begin][end] = min;}else {//其他情況提示出錯cout << "ERROR!" << endl;getchar();getchar();exit(-1);}//現實計算結果以便檢查,并返回cout << dp[begin][end] << endl;return dp[begin][end];
}int main() {//讀取文件
fstream fs;fs.open("input.txt", ios::in);int n; //站點數量int dp[max][max]; //存放任意兩站之間的最小費用的表int port[max][max]; //存儲初始信息,各站點直達其他站點的費用
fs >> n;cout << n << endl;//初始化,以-1為空值for (int i = 0; i < n; i++){for (int j = 0; j < n; j++) {dp[i][j] = -1;port[i][j] = -1;}}//讀取并儲存第x站到第y站的費率for (int i = 0; i < n - 1; i++) {for (int j = i + 1; j < n; j++) {fs >> port[i][j];cout << port[i][j] << '\t';}cout << endl;}//結束讀取,關閉文件
fs.close();int ret = solve(dp, port, n - 1, 0);//結果寫入到文件fs.open("output.txt", ios::out);fs << ret;fs.close();cout << ret << endl;cout << "Finish" << endl;cin >> n;return 0;
}
?
轉載于:https://www.cnblogs.com/memoryLost/p/10629534.html
總結
以上是生活随笔為你收集整理的计算首站到末站最小费用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI零基础入门之人工智能开启新时代—下篇
- 下一篇: go--基本数据类型