DP 租用游艇

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

  

原文地址:https://www.cnblogs.com/qingjiuling/p/10176678.html