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

 

posted @ 2020-10-12 19:05  neverstopcoding  阅读(85)  评论(0编辑  收藏  举报