P1359 租用游艇
题目描述:
思路:
//dp[i][j]代表的是i到j的距离
dp思想 核心递推式:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); (i<=k<=j)
但实际上本题起点确定了 故i取1即可
代码:
#include<iostream> #include<algorithm> using namespace std; const int maxn=200+10; const int INF=1e6+10; int dp[maxn][maxn]={0}; int mapp[maxn][maxn]={0}; //mapp[i][j]代表的是i到j的距离 int n; //题目已知起始点就是1号 int main(){ cin>>n; for(int i=1;i<=n-1;i++){ //从第二号游艇开始 for(int j=i+1;j<=n;j++){ cin>>mapp[i][j]; dp[i][j]=mapp[i][j]; } } //已下是起点不确定的dp核心代码 // for(int i=1;i<=n-1;i++){ // for(int j=i+1;j<=n;j++){ // int t=INF; // for(int k=i;k<=j;k++){ // t=min(t,dp[i][k]+dp[k][j]); // } // dp[i][j]=t; //取到最小值 // } // } //但实际上起点已经确定 则不需要三重循环 for(int j=2;j<=n;j++){ int t=INF; for(int k=1;k<=j;k++){ t=min(t,dp[1][k]+dp[k][j]); } dp[1][j]=t; //取到最小值 } cout<<dp[1][n]; return 0; }