动规方程 f[i]=min(f[i],f[i?j]+sum)
我们默认为新加一头牛,自占一条船。想象一下,它不断招呼前面的牛,邀请它们坐自己这条船,当且仅当所需总时间更短时,前一头奶牛会接受邀请,最多邀请前面的所有奶牛一起坐这条船。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=2505; 6 int n,m,mt[maxn],f[maxn]; 7 int main(){ 8 scanf("%d%d",&n,&m); 9 for(int i=1;i<=n;i++)scanf("%d",&mt[i]); 10 memset(f,101,sizeof(f)); 11 f[0]=0; 12 for(int i=1;i<=n;i++){ 13 int sum=2*m; 14 for(int j=1;j<=i;j++){ 15 sum+=mt[j]; 16 f[i]=min(f[i],f[i-j]+sum); 17 } 18 } 19 printf("%d",f[n]-m); 20 return 0; 21 }