BZOJ 1617 Usaco 2008 Mar. River Crossing渡河問題
阿新 • • 發佈:2018-02-01
return 分享 最短 tdi log clu ace char 圖片
【題解】
顯然是個DP題。
設$f[i]$表示送$i$頭牛過河所需的最短時間,預處理出$t[i]$表示一次性送i頭牛過河所需時間,那麽我們可以得到轉移方程:$f[i]=min(f[i],f[i-j]+t[j]+t[0])$ (這裏的$t[0]$指的是FJ獨自過河的時間)
這樣就可以做一個$n$方的DP了
#include<cstdio> #include<algorithm> #define rg register #define inf (1e9) #define N (100010) using namespace std; int n,m,f[N],t[N]; inline int read(){ int k=0,f=1; char c=getchar(); while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar(); while(‘0‘<=c&&c<=‘9‘)k=k*10+c-‘0‘,c=getchar(); return k*f; } inline int min(int x,int y){return x<y?x:y;} int main(){ n=read(); t[0]=read(); for(rg int i=1;i<=n;i++) t[i]=read()+t[i-1]; for(rg int i=1;i<=n;i++){ f[i]=inf; for(rg int j=1;j<=i;j++) f[i]=min(f[i],f[i-j]+t[j]+t[0]); } printf("%d\n",f[n]-t[0]); return 0; }
BZOJ 1617 Usaco 2008 Mar. River Crossing渡河問題