CSP-S划分 解题报告
n <= 10
爆搜即可
n <= 50
什么乱搞
n <= 400
有一个 \(n^3\) 的 dp
设 dp[i][j] 表示最后一段为 j+1~i 时的最小值
直接三层循环转移即可
dp[1][0] = 0;
for(int i = 1;i <= n;i ++)
{
dp[i][0] = qi[i] * qi[i];
for(int j = 1;j < i;j ++)
for(int k = 0;k < j;k ++)
{
if(qi[i] - qi[j] >= qi[j] - qi[k]) dp[i][j] = min(dp[i][j], dp[j][k] + (qi[i] - qi[j]) * (qi[i] - qi[j]));
}
}
这里 qi 数组为前缀和
n <= 5000
通过大胆的打表我们发现,这个玩意在 j 最大,k 最大且合法时取到最小值
然后我们对于每个 j ,在转移时额外把 k 记录到 l 数组中,可以把 k 的循环优化掉,变成 \(n^2\) 。
dp[0] = 0;
for(int i = 1;i <= n;i ++)
{
for(int j = i - 1;j >= 0;j --)
{
if(qi[i] - qi[j] >= qi[j] - qi[l[j]])
{
dp[i] = dp[j] + (qi[i] - qi[j]) * (qi[i] - qi[j]);
l[i] = j;
break;
}
}
}
n <= 500000
把要求的式子变变形,发现:
\(qi[i] >= qi[j] * 2 - qi[l[j]]\)
由于qi[i]一直在增大,所以当新加入的 j 的 \(qi[j] * 2 - qi[l[j]]\) 比之前的要小的话,后面的数只会从 j 转移,不会从之前的数转移。
所以可能被转移的,是一个 \(qi[j] * 2 - qi[l[j]]\) 的序列。
这不一眼单调队列
然后搞成了 \(O(n)\)
dp[0] = 0;
q.push_back(0);
for(int i = 1;i <= n;i ++)
{
int back = -1;
while(!q.empty() && qi[i] >= 2 * qi[q.front()] - qi[l[q.front()]]) back = q.front(), q.pop_front();
if(back != -1) q.push_front(back);
int j = q.front();
dp[i] = dp[j] + (qi[i] - qi[j]) * (qi[i] - qi[j]);
l[i] = j;
while(!q.empty() && 2 * qi[i] - qi[l[i]] <= 2 * qi[q.back()] - qi[l[q.back()]]) q.pop_back();
q.push_back(i);
}
算法复杂度已经正确了,但这道题出题人硬是要搞一个高精。如果用__int128转移那么1G空间都不够你用的。
所以就这样吧
CSP-S划分 解题报告的更多相关文章
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何 ...
- 解题报告 之 HDU5303 Delicious Apples
解题报告 之 HDU5303 Delicious Apples Description There are n apple trees planted along a cyclic road, whi ...
- CF598: div3解题报告
CF598:div3解题报告 A: Payment Without Change 思路: 按题意模拟即可. 代码: #include<bits/stdc++.h> using namesp ...
- 【九度OJ】题目1078:二叉树遍历 解题报告
[九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ...
- 【LeetCode】886. Possible Bipartition 解题报告(Python)
[LeetCode]886. Possible Bipartition 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu ...
- 【LeetCode】785. Is Graph Bipartite? 解题报告(Python)
[LeetCode]785. Is Graph Bipartite? 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu. ...
- 【LeetCode】813. Largest Sum of Averages 解题报告(Python)
[LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)
[剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
随机推荐
- R7800 2.4G webshell
webshell执行 iwpriv ath1 disablecoext 1
- DOSBox进行文件操作
1.使用DOSBox进行汇编语言的学习 2.输入edit进行asm文件编辑,保存后输入masm 文件名.asm,进行编译:输入link 文件名进行连接:输入debug 文件名.exe进行执行,并进行调 ...
- nmon 采坑
1.安装 wget http://sourceforge.net/projects/nmon/files/nmon16g_x86.tar.gz 2.解压 tar -zxvf nmon16g_x86.t ...
- Ajax同步和异步的区别,如何解决跨域的问题
同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式),同步强调的是顺序性,谁先谁后,异步则不存在这种顺序性. 同步:浏览器访问服务器请求,用 ...
- linux相关命令-linux查看头两行、查看最后两行-查找一个文件里包含的error信息并且把它输出到另一个文件里-查看滚动日志-在一个目录下查找大于50M的文件-根据端口号去杀死某一个进程
1.linux查看头两行.查看最后两行 使用head(查看前几行).tail(查看末尾几行).eg:查看/home/wenjian1的前10行内容,应该是:# head -n 10 /home/wen ...
- iframe 嵌套别的系统不显示,父窗口不响应
显示不全,没有登录界面,检查了代码渲染了,只是display:none :换了网址 ,别的都可以,只有这个不行 搜索 复制
- ORA-01427: 单行子查询返回多个行 出现原因及对应防止措施
原因:没有做好子查询约束条件 解决方法:1.加 AND ROWNUM =1 条件 但筛选结果可能并非一定是你想要的 2.匹配查询唯一约束条件
- shell中产生随机字符串的方法
random变量 echo $RANDOM 8746 生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余. 再结合md5生成字符串 echo $RANDOM |md5s ...
- opencv实战之透视变换
import cv2 import numpy as np import pytesseract def cv_show(imgname,img): cv2.imshow(imgname,img) c ...
- Jndi结合DynamicDataSource实现多数据源配置
首先注意本框架是SSM,配置主要在两个地方.第一个是applicationContext.xml,第二个文件是Tomcat下面的context.xml里面 1.context.xml文件配置的代码如下 ...