BZOJ 1742 [Usaco2005 nov]Grazing on the Run 邊跑邊吃草【區間DP】
阿新 • • 發佈:2018-11-08
這道題就當做複習區間DP的板子題吧QvQ
表示當前已經吃完了區間 內的草並且當前停留在最左邊與最右邊
方程隨便推一下就出來了QvQ:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define db double #define sg string #define ll long long #define rep(i,x,y) for(ll i=(x);i<=(y);i++) #define red(i,x,y) for(ll i=(x);i>=(y);i--) using namespace std; const ll N=1e3+5; const ll Inf=1e18; ll n,m,p[N],f[N][N][2]; inline ll read() { ll x=0;char ch=getchar();bool f=0; while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?-x:x; } int main() { n=read(),m=read(); rep(i,1,n) p[i]=read(); p[++n]=m; sort(p+1,p+1+n); rep(i,1,n) f[i][i][0]=f[i][i][1]=abs(m-p[i])*n; rep(len,2,n) rep(i,1,n+1-len) { ll j=i+len-1; f[i][j][0]=min(f[i+1][j][0]+(p[i+1]-p[i])*(n-j+i),f[i+1][j][1]+(p[j]-p[i])*(n-j+i)); f[i][j][1]=min(f[i][j-1][0]+(p[j]-p[i])*(n-j+i),f[i][j-1][1]+(p[j]-p[j-1])*(n-j+i)); } printf("%lld\n",min(f[1][n][0],f[1][n][1])); return 0; }