1. 程式人生 > 實用技巧 >P1359 租用遊艇

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