题意:n个人坐船过河,只有一条船,每条船能坐两个人,过河的时间取决于两个人中最慢的一个,问过河最快共需多少时间?
先使d[0...n-1]有序;
则
d[0]表示过河最快的
d[1]表示过河次快的
对于每一个i,
d[i] 表示当前过河最慢的
d[i-1] 表示当前过河次慢的
dp[0]=d[0];
dp[1]=d[1];
dp[2]=dp[1]+d[2]+d[0];
//(i>=3)时,dp[i]是以下两种情况中速度快的一种:
//( 此时d[0] d[1]已在对岸)
//1. 在dp[i-1]的前提下 d[0]回来,将d[i]带走
//2. 在dp[i-2]的前提下 d[0]回来,d[i]将d[i-1]带走,d[1]回来将d[0]带走
dp[i]=min(dp[i-1]+d[0]+d[i],dp[i-2]+d[1]+d[0]+d[i]+d[1]);
有人说不知道样例输入数据是怎么构造出17的,见下面简图:
#include<iostream>
#include<algorithm>
using namespace std;
int d[1010];
int dp[1010];
int main(){
int cases;
cin>>cases;
while(cases--){
int n;
int min1;
int min2;
cin>>n;
for(int i=0;i<n;i++){
cin>>d[i];
}
sort(d,d+n);
dp[0]=d[0];
dp[1]=d[1];
dp[2]=dp[1]+d[2]+d[0];
for(int i=3;i<n;i++){
min1=dp[i-1]+d[i]+d[0];
min2=dp[i-2]+d[1]+d[0]+d[i]+d[1];
dp[i]=(min1<min2)?min1:min2;
}
cout<<dp[n-1]<<endl;
}
}