HDU3480(Division 斜率优化dp入门题)

题目
在这里插入图片描述题意: n个数分成m组,每组的花费是(max-min)^2,求最小花费;

先对所有数字的权值从小到大排序。
dp[i][j]:前 j 个数分成 i 组.
则转移方程为:dp[i][j]=dp[i-1][k]+(a[j]-a[k+1])^2.(0<=k<j)
把外层循环 i 看作定值,j 是状态变量,k 是决策变量。方程存在项 2 * a[j] * a[k+1],应考虑使用斜率优化。
变成方程 f[i]=f[j]+(a[i]-a[j+1]) ^ 2 (0<=j<i) 对方程进行移向,等号左边仅放与 j 有关的项,等号后边放 i , j乘积有关的项以及仅与 i 有关的项。

f[j] + a[j]^ 2=a[i] * (2 * a[j+1])+f[i]-a[i]^2;
f[j]:将前 j个数分成 d 组的花费 所以随着 j 变大 f[j]也增大
使用flag^1 进而采用滚动数组

#include<cstdio>
#include<algorithm>
typedef long long ll;
using namespace std;
const int N=1e4+5;
int a[N],dp[N][2],q[N],flag;//flag在这里用作滚动数组 每次修改分成第d+1组的 查询第d组需要用到d组的dp值 而更新则会乱套 所以采用滚动数组。
inline int getX(int i,int j){
   
    return 2*a[j+1]-2*a[i+1];
}
inline 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值