原题链接
算法概述
f[i]表示从1号点开始到当前站点下船所需的最少价值。
对于f[i],考虑枚举最后一次租船的起始站点j,1<=j<=i-1,
则有f[i]=min{f[j] + w[j][i]}
边界,显然在1号点时无需付钱,f[1]=0。
注意要求最小值,故初始化正无穷。
参考代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=210,INF=0x3f3f3f3f; int w[N][N]; int f[N]; int n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) scanf("%d",&w[i][j]); memset(f,0x3f,sizeof f); f[1]=0; for(int i=1;i<=n;i++) for(int j=1;j<i;j++) f[i]=min(f[i],f[j]+w[j][i]); printf("%d ",f[n]); return 0; }