P1359 租用遊艇
阿新 • • 發佈:2020-10-12
題目描述:
思路:
//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; }