小学数奥见祖宗(相信大多数人小学都看过这个玩意
如果你没看过这个问题,第一反应可能是让跑的最快的来回送火把,然而样例已经hack掉了这种做法,更优的做法是让跑的最快的和第二快的来回送火把。然后事实上这两种一定能组合出最优决策,为什么不会有什么跑的前三前四前几快的来回送的情况呢?因为一次只能过两个人的话让更慢的去送是没有意义的,于是递推一下就可以了
注意边界和特判什么的......

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 const int N=100005; 5 long long a[N],rec[N],n; 6 void SPJ() 7 { 8 if(n<=2) 9 printf("%lld",a[n]),exit(0); 10 } 11 int main () 12 { 13 scanf("%lld",&n); 14 for(int i=1;i<=n;i++) 15 scanf("%lld",&a[i]); SPJ(); 16 rec[n-1]=a[1]+a[n]; 17 for(int i=n-2;i>=2;i--) 18 rec[i]=std::min(rec[i+1]+a[1]+a[i+1],rec[i+2]+a[2]+a[1]+a[i+2]+a[2]); 19 printf("%lld",rec[2]+a[2]); 20 return 0; 21 }