本文共 1975 字,大约阅读时间需要 6 分钟。
普 通 n 2 的 转 移 是 普通n^2的转移是 普通n2的转移是
设 f 是 费 用 系 数 的 前 缀 和 数 组 , t 是 任 务 花 费 时 间 的 前 缀 和 数 组 设f是费用系数的前缀和数组,t是任务花费时间的前缀和数组 设f是费用系数的前缀和数组,t是任务花费时间的前缀和数组
d p [ i ] = d p [ j ] + s ∗ ( f [ n ] − f [ j ] ) + t [ i ] ∗ ( f [ i ] − f [ j ] ) dp[i]=dp[j]+s*(f[n]-f[j])+t[i]*(f[i]-f[j]) dp[i]=dp[j]+s∗(f[n]−f[j])+t[i]∗(f[i]−f[j])
让 我 们 按 照 惯 例 化 简 一 下 让我们按照惯例化简一下 让我们按照惯例化简一下
d p [ j ] = s ∗ f [ j ] + t [ i ] ∗ f [ j ] − s ∗ f [ n ] − t [ i ] ∗ f [ i ] + d p [ i ] dp[j]=s*f[j]+t[i]*f[j]-s*f[n]-t[i]*f[i]+dp[i] dp[j]=s∗f[j]+t[i]∗f[j]−s∗f[n]−t[i]∗f[i]+dp[i]
d p [ j ] = ( s + t [ i ] ) ∗ f [ j ] − s ∗ f [ n ] − t [ i ] ∗ f [ i ] + d p [ i ] dp[j]=(s+t[i])*f[j]-s*f[n]-t[i]*f[i]+dp[i] dp[j]=(s+t[i])∗f[j]−s∗f[n]−t[i]∗f[i]+dp[i]
这 样 把 d p [ j ] 看 成 y , 把 f [ j ] 看 成 x 这样把dp[j]看成y,把f[j]看成x 这样把dp[j]看成y,把f[j]看成x
发 现 直 线 的 斜 率 确 定 , 是 s + t [ i ] , 是 个 定 值 ( 因 为 当 前 在 转 移 i ) 发现直线的斜率确定,是s+t[i],是个定值(因为当前在转移i) 发现直线的斜率确定,是s+t[i],是个定值(因为当前在转移i)
发 现 直 线 的 截 距 是 − s ∗ f [ n ] − t [ i ] ∗ f [ i ] + d p [ i ] 发现直线的截距是-s*f[n]-t[i]*f[i]+dp[i] 发现直线的截距是−s∗f[n]−t[i]∗f[i]+dp[i]
惊 人 的 发 现 ! ! 截 距 只 和 i 有 关 , 说 明 截 距 越 小 , d p [ i ] 越 小 惊人的发现!!截距只和i有关,说明截距越小,dp[i]越小 惊人的发现!!截距只和i有关,说明截距越小,dp[i]越小
现在的任务就是找到一个j,使得这条直线的截距最小
那 么 维 护 一 个 下 凸 包 , 相 邻 两 点 的 斜 率 递 增 那么维护一个下凸包,相邻两点的斜率递增 那么维护一个下凸包,相邻两点的斜率递增
第 一 个 斜 率 大 于 s + t [ i ] 的 j 就 是 最 优 的 j 第一个斜率大于s+t[i]的j就是最优的j 第一个斜率大于s+t[i]的j就是最优的j
#includeusing namespace std;const int maxn=5009;int n,s,tt[maxn],ff[maxn],q[maxn],dp[maxn];int t[maxn],f[maxn];int l=1,r=1;int mu(int l,int r){ return dp[l]-dp[r];}int zi(int l,int r){ return f[l]-f[r]; }int main(){ cin >> n >> s; memset(dp,127,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++) cin >> tt[i] >> ff[i],t[i]=t[i-1]+tt[i]; for(int i=1;i<=n;i++) f[i]=f[i-1]+ff[i]; for(int i=1;i<=n;i++) { while( l <=zi(q[l+1],q[l])*( s+t[i] ) ) l++; dp[i]=dp[q[l]]-( s+t[i] )*f[q[l]]+s*f[n]+t[i]*f[i]; while( l <=mu(q[r],q[r-1])*zi(i,q[r]) ) r--;//剔除斜率小于当前直线的点 q[++r]=i; } cout << dp[n];}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/108210847 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!