解題思路:
這一題運用的是貪心思想,不能想出,每一步的最優解存在於兩種方案中,第一種是過河最短時間的人開船過來,接走一個過河時間最長的人再開船返回。第二種是過河時間最短的人開船過來,他留下,讓當前兩個最長過河時間的人乘船過岸,然後再讓對岸最短過河時間的人開船過河將他接回。
令dp[i]爲將前i個人運送過河所需要的最短時間,再列出狀態轉移方程
代碼:
#include<bits/stdc++.h>
using namespace std;
int n,arr[100010],dp[100010];
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>arr[i];
sort(arr+1,arr+1+n);
dp[1]=arr[1];
dp[2]=arr[2];
for(int i=3;i<=n;++i)
dp[i]=min(dp[i-1]+arr[1]+arr[i],dp[i-2]+arr[1]+arr[i]+2*arr[2]);
cout<<dp[n]<<endl;
return 0;
}