目錄題目傳送門
也是一道比較經典的斜率優化\(dp\),很容易推出dp轉移方程:
\(dp[i]=min(dp[j]+cost(i,j))+c[i]\)
重點就是怎麼快速的算出cost(i,j)。我們把cost的計算公式寫出來:
\(cost(i,j)=\sum_^ip[k]*(x[i]−x[k])=x[i]*\sum_^ip[k]-\sum_^ip[k]*x[k]\)
我們記sum[i]為p[i]的字首和,b[i]為p[i]∗x[i]的字首和,那麼dp轉移就是:
\(dp[i]=min(dp[j]+x[i]*(sum[i)−sum[j])−(b[i])−b[j])+c[i]\)
於是我們就可以愉悅的用斜率優化來做這道題了,如果k>j並且k比j更優,那麼:
\(dp[j]+x[i]*(sum[i]sum[j])−(b[i])−b[j]≥dp[k]+x[i]*(sum[i)−sum[k])−(b[i])−b[k]\)
最後就是套用斜率優化的步驟了。
#include using namespace std;
typedef long long ll;
bool finish_read;
templateinline void read(t &x)while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;finish_read=1;}
templateinline void print(t x)
templateinline void writeln(t x)
templateinline void write(t x)
/****************=header template**********====*/
#define pause printf("press enter key to continue..."); fgetc(stdin);
const int maxn=1e6+500;
int n;
ll dis[maxn],c[maxn],p[maxn],f[maxn],sum[maxn],b[maxn];
int l,r;
int que[maxn];
/****************===define area***************=*/
double cal(int x,int y)
int main()
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
printf("%lld\n",f[n]);
return 0;
}
bzoj1096 倉庫建設
l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...
倉庫建設(bzoj 1096)
l公司有n個工廠,由高到底分布在一座山上。如圖所示,工廠1在山頂,工廠n在山腳。由於這座山處於高原內 陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象 部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於...
bzoj1096 倉庫建設 斜率優化
dsy1096 zjoi2007 倉庫建設 問題描述 l公司有 n個工廠,由高到底分布在一座山上。如圖所示,工廠 1在山頂,工廠 n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁 l先生接到氣象部門的 被告知三天之後將有一場暴雨,於...