解题:POI 2004 Bridge

题面

小学数奥见祖宗(相信大多数人小学都看过这个玩意

如果你没看过这个问题,第一反应可能是让跑的最快的来回送火把,然而样例已经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 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/9861526.html