从题目中规律可以看出来在某个人要过河的时候要么是最快的那个人来接她,要么是还剩下两个让最快的把船开回来然后让这两个过去,之后让第二快的把船开过来,全部过去。这两个在题目中的样例里面都有体现。
dp[i] = max(dp[i-1]+a[0]+a[i], dp[i-2]+a[0]+a[i]+a[1]+a[1]);
//dp[i] = max(dp[i-1]+a[0]+a[i], dp[i-2]+a[0]+a[i]+a[1]+a[1]); #include <bits/stdc++.h> using namespace std; vector<int> a; vector<int> dp(100001, 0x3f3f3f3f); int main() { int N, k; cin>>N; for (int i=0;i<N;i++) { cin>>k; a.push_back(k); } sort(a.begin(), a.end()); for (int i=1;i<=N;i++) { if (i==1) dp[i] = a[1]; if (i>=2) { dp[i] = min(dp[i-1]+a[0]+a[i], dp[i]); dp[i] = min(dp[i-2]+a[0]+a[i]+a[1]+a[1], dp[i]); } // cout<<dp[i]<<endl; } cout<<dp[N-1]; return 0; }