1. 程式人生 > >bzoj1617 / P2904 [USACO08MAR]跨河River Crossing

bzoj1617 / P2904 [USACO08MAR]跨河River Crossing

memset () 自己 過河 奶牛 ring lose scanf mes

P2904 [USACO08MAR]跨河River Crossing

顯然的dp

設$f[i]$表示運走$i$頭奶牛,木筏停在未過河奶牛一側所用的最小代價

$s[i]$表示一次運$i$頭奶牛到對面的代價

我們枚舉上次運走了$j$頭,顯然$f[i]=min(f[i],f[i-j]+s[j]+s[0])$(註意自己要劃回來)

最後不用劃回來,減去一個$s[0]$即可

end.

技術分享圖片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define re register
 5
using namespace std; 6 int min(int a,int b){return a<b?a:b;} 7 #define N 2502 8 int n,a,f[N],s[N]; 9 int main(){ 10 memset(f,127,sizeof(f)); f[0]=0; 11 scanf("%d%d",&n,&s[0]); 12 for(re int i=1;i<=n;++i) scanf("%d",&a),s[i]=s[i-1]+a; 13 for(re int i=1;i<=n;++i)
14 for(re int j=0;j<i;++j) 15 f[i]=min(f[i],f[j]+s[i-j]+s[0]); 16 printf("%d",f[n]-s[0]);//最後不用劃回來 17 return 0; 18 }
View Code

bzoj1617 / P2904 [USACO08MAR]跨河River Crossing