洛谷P1359租用游艇
分析:这个游艇我看到题目下意识的就想将dp数组设为dp[i][j]表示i到j之间的最短距离,但题目上要求的只是从起点到终点的距离,这样设只是自找麻烦。
直接设成dp【i】表示从起点到i的最短距离。
状态转移方程是dp[i]=min(dp[i],dp[j]+a[i][j]),比较浅显我就不过多解释了
注意的是状态转移求的是最小,所以要记得将dp数组初始化一个很大的值,但dp[0]是起点到起点,还是要设为0的
#include<bits/stdc++.h> using namespace std; typedef long long ll; const double pi=acos(-1); const int inf=1<<30; int a[210][210]; int dp[210]; int main(){ int n;scanf("%d",&n); fill(dp,dp+210,inf); dp[0]=0; for(int i=0;i<n-1;i++){ for(int j=i+1;j<n;j++)scanf("%d",&a[i][j]); } for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ dp[i]=min(dp[i],dp[j]+a[j][i]); } } cout<<dp[n-1]<<endl; return 0; }