洛谷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;
}