HDU - 2829 Lawrence(斜率优化)
发布日期:2021-10-03 15:44:44
浏览次数:1
分类:技术文章
本文共 2013 字,大约阅读时间需要 6 分钟。
题目大意:给你N个数,要求你分成M个部分,每部分的得分为,假设该部分为i, j, k, 那么的分就为i * j + i * k + j * k
问划分后,至少能得多少分解题思路:设dp[i][j]为前面i个数,分成j个部分能得到得最小得分
得转移方程dp[i][j] = dp[k][j - 1] + cost[i] - cost[k] - (sum[i] - sum[k]) * sum[k] 这里的cost[i]表示的是前i个数为1个部分的情况下所能得到的分 因为cost[i] - cost[k]后,还多了sum[k] * (sum[i] - sum[k]),所以后面要减去 现在设l > k,且在l比j更优 则dp[k][j - 1] + cost[i] - cost[k] - sum[k] * (sum[i] - sum[k]) >= dp[l][j - 1] + cost[i] - cost[l] - sum[l] * (sum[i] - sum[l]) 化简可得 sum[i] >= (dp[l][j - 1] - cost[l] + sum[l] ^ 2 - dp[k][j - 1] + cost[k] - sum[k] ^ 2) / (sum[l] - sum[k])这样就得到斜率优化的式子了
#include#include #include using namespace std;const int N = 1010;int n, m;int sum[N], cost[N], que[N], dp[N][N];int getUp(int j, int k, int boom) { return dp[j][boom] - cost[j] + sum[j] * sum[j] - (dp[k][boom] - cost[k] + sum[k] * sum[k]);}int getDown(int j, int k) { return sum[j] - sum[k];}void solve() { for (int i = 1; i <= n; i++) { dp[i][0] = cost[i]; dp[i][i - 1] = 0; } int head, tail; for (int boom = 1; boom <= m; boom++) { head = tail = 0; que[tail++] = boom; for (int i = boom + 1; i <= n; i++) { while (head + 1 < tail && getUp(que[head + 1], que[head], boom - 1) <= getDown(que[head + 1], que[head]) * sum[i]) head++; int t = que[head]; dp[i][boom] = dp[t][boom - 1] + cost[i] - cost[t] + sum[t] * sum[t] - sum[i] * sum[t]; while (head + 1 < tail && getUp(i, que[tail - 1], boom - 1) * getDown(que[tail - 1], que[tail - 2]) <= getUp(que[tail - 1], que[tail - 2], boom - 1) * getDown(i, que[tail - 1])) tail--; que[tail++] = i; } } printf("%d\n", dp[n][m]);}void init() { sum[0] = cost[0] = 0; for (int i = 1; i <= n; i++) { scanf("%d", &sum[i]); cost[i] = cost[i - 1] + sum[i - 1] * sum[i]; sum[i] += sum[i - 1]; }}int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); solve(); } return 0;}
转载地址:https://blog.csdn.net/L123012013048/article/details/48947245 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月04日 04时27分00秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
思科 Packet Tracer 实验六 RIP路由协议基本配置
2019-04-26
计算机网络实验七:DHCP基本配置
2019-04-26
计算机网络实验八:思科NAT的基本配置
2019-04-26
三郎数据结构算法学习笔记:单向环形链表约瑟夫问题
2019-04-26
前端特效H5+css+js:动态可拉进度条+附完整源码
2019-04-26
三郎数据结构学习笔记:双向循环链表(判断是否对称)附源码
2019-04-26
三郎数据结构算法学习笔记:基数排序
2019-04-26
三郎数据结构算法学习笔记:斐波那契(黄金分割法)查找算法
2019-04-26
Java中标识符的命名规则是什么?硬性要求和非硬性要求
2019-04-26
Java中八种基本数据类型的大小,以及他们的封装类
2019-04-26
Spring依赖注入的方式有几种,各是什么?
2019-04-26
SpringMVC怎么样设定重定向和转发的?
2019-04-26
SpringMVC常用的注解有哪些?
2019-04-26
spring bean的生命周期
2019-04-26
计算机网络子网划分详解
2019-04-26
计算机网络生成树算法STP简介
2019-04-26
三郎数据结构算法学习笔记:哈希表查找
2019-04-26
三郎数据结构算法学习笔记:二叉树的三种遍历及增删改查
2019-04-26
三郎数据结构算法学习笔记:顺序存储二叉树
2019-04-26
三郎数据结构算法学习笔记:线索二叉树
2019-04-26