因为可以说是完全不会dp,所以这道题目没有什么好的思路直接看的题解。现在过去了好几天了,来回忆一下写一篇博客。
看了题解,想到了两个思路,按照提交的顺序,回忆一下。
首先对每一个出租站来说,从它这个出租站出发抵达最后一个出租站花费的最小的租金就是
它到后面某一个站的租金+某一个站到最后一个站的租金
转移方程:dp[i] = min(dp[i], a[i][j] + dp[j])
代码的话,要从倒数第二个站往回考虑,对于每一个出租站来说,都是要先在这个出租站找到一个最小的租金才可以。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[205][205];
int dp[205];
const int INF = 0x3f3f3f;
int main() {
cin >> n;
for(int i = 1; i < n; i++) {
for(int j = i+1; j <= n; j++) {
cin >> a[i][j];
}
dp[i] = INF;
}
for(int i = n-1; i >= 1; i--) {
for(int j = i+1; j <= n; j++) {
dp[i] = min(dp[i], a[i][j] + dp[j]);
}
}
cout << dp[1] << endl;
return 0;
}
第二种思路:
对于每一个出租站来说
如果他没有到过的话,那么就更新这个出租站的租金
如果他到过的话,那么就看他和现记录的租金比较那个更加的小,如果新来的更小的话,那就更新,否则就不更新。
#include<bits/stdc++.h>
using namespace std;
int n;
int x;
int b[205]; // b[x] 表示从第一个站到第x个站的距离
int main() {
cin >> n;
for(int i = 1; i < n; i++) {
for(int j = i+1; j <= n; j++) {
cin >> x;
if(b[j] == 0 || b[i] + x < b[j]) {
b[j] = x + b[i];
}
}
}
cout << b[n];
return 0;
}
有空一定要复习一下