日期:2023-06-14 21:32:07 来源:博客园
(资料图片)
引入前言本文的资料和图片均来自 \(\texttt{OI-Wiki}\)。
过程题目描述在一个操场上摆放着一排 \(N\) 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 \(2\) 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将 \(N\) 堆石子合并成一堆的最小得分。\((N \leq 40000)\)
我们看到这个题,自然而然会想到区间 DP,即朴素的做法。
#includeusing namespace std;typedef long long ll;ll r[600], g[600];ll dp[600][600];int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; ++ i) {scanf("%lld", &r[i]);r[i + n] = r[i];g[i] = g[i - 1] + r[i];dp[i][i] = 0;}for (int i = n + 1; i <= 2 * n; ++ i) {dp[i][i] = 0;g[i] = g[i - 1] + r[i];}for (int l = 1; l < n; ++ l) {for (int i = 1, j = i + l; i < n * 2 && j <= n * 2; ++ i, j = i + l) {dp[i][j] = 100000000;for (int k = i; k < j; ++ k) {dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + g[j] - g[i - 1]);}}}ll minn = 0x3f3f3f3f;for (int i = 1; i <= n; ++ i) {minn = min(minn, dp[i][i + n - 1]);}printf("%lld", minn);return 0;}
交上去后,你会发现,RE 了 \(7\) 个。为什么?因为 \(n\) 太大了,二维数组开不下,其次就算是用了什么不为人知的手段开下了这么大的数组,\(n^2\) 的复杂度也铁定超时。这可怎么办呢?下面介绍一种专门处理石子合并这类问题的算法——Garsia-Wachs 算法
Garsia-Wachs 算法Garsia-Wachs 的步骤如下:在序列的两端设置极大值。在序列中找到前三个连续的权重值 \(x, y, z\) 使得 \(x \leq z\)。因为序列结尾的最大值大于之前的任意两个有限值,所以总是存在这样的三元组。从序列中移除 \(x\) 和 \(y\),并在原来 \(x\) 的位置以前大于或等于 \(x+y\) 且距 \(x\) 最近的值的右边重新插入元素,元素值为 \(x+y\)。因为左端最大值的存在,所以总是存在这样的位置。为了有效地实现这一阶段,该算法可以在任何平衡二叉查找树结构中维护当前值序列。这样的结构允许我们在对数时间内移除 \(x\) 和 \(y\),并重新插入新节点 \(x + y\)。在每一步中,数组中位于偶数索引上直到 \(y\) 值的权重形成了一个递减序列,位于奇数索引位的权重形成另一个递减序列。因此,重新插入 \(x+y\) 的位置可以通过在对数时间内对这两个递减序列使用平衡树执行两次二分查找找到。通过从前一个三元组 \(z\) 值开始的线性顺序搜索,我们可以在总线性时间复杂度内执行对满足 \(x \leq z\) 的第一个位置的搜索。如果实在不会平衡树,Garsia-Wachs 算法的总时间复杂度为 \(O(n\log n)\),时间复杂度证明?我只能说,学 OI 记住结论就好了,证明,那是数学要考虑的事,不是 OI 要考虑的事 vector
的 insert
和 erase
操作也是个不错的选择呢!考试又不会让你证明时间复杂度至于正确性的证明我也不会= =,这个算法应用范围十分有限,因此学的价值不是很高,“会用” + “知道有这个东西” 就行了关于上面那道引入题的代码:
#include using namespace std;typedef long long ll;inline ll read() {ll x = 0;int fg = 0;char ch = getchar();while (ch < "0" || ch > "9") {fg |= (ch == "-");ch = getchar();}while (ch >= "0" && ch <= "9") {x = (x << 3) + (x << 1) + (ch ^ 48);ch = getchar();}return fg ? ~x + 1 : x;}const int N = 4e4 + 5;int n, ans;vector g;int merge() {int k = g.size() - 2;for (int i = 0; i <= k; ++ i) {if (g[i] <= g[i + 2]) {k = i;break;}}int tmp = g[k] + g[k + 1];g.erase(g.begin() + k);g.erase(g.begin() + k);int t = -1;for (int i = k - 1; i >= 0; -- i) {if (g[i] >= tmp) {t = i;break;}}g.insert(g.begin() + t + 1, tmp);return tmp;}int main() {n = read();for (int i = 1; i <= n; ++ i) {g.emplace_back(read());}for (int i = 1; i < n; ++ i) {ans += merge();}printf("%d\n", ans);return 0;}
标签:
上一篇: 砀山先锋网干部公示_砀山县先锋网
下一篇: 最后一页
「学习笔记」Garsia-Wachs 算法
砀山先锋网干部公示_砀山县先锋网
即时看!定向培养军士,招收23225人!报考指南→
女生发mua是什么意思怎么回(女生发mua是什么意思)
60亿公里外看地球,会是什么样的?|热文
洪都拉斯各界关注洪总统访华 期待加深中洪合作
禾川科技股东魏中浩累计减持公司股份302万股 天天播资讯
环球讯息:高力香港建议北部都会区采用混合批地方式吸引投资者
环球时讯:维力医疗接待国投信邦(北京)资产管理有限公司等多家机构调研
全球快消息!新消费品牌“消失”在618
38支队伍逐浪竞渡!中华龙舟大赛首站比赛将在盐城大洋湾景区鸣锣挥桨
iPhone 15泄露信息揭示涨价背后原因|天天快讯
焦点快播:朗逸新锐具备怎样优秀的特点和卖点?
条纹裤在冬季比春夏秋更易塑型,让你时髦气质的出街
dnf婚房和戒指满属性是多少_dnf璀璨的粉玉戒指怎么得属性怎么样 全球新动态
一男子当街被砍伤,当地回应:伤者得到及时救治,凶手已锁定
姆巴佩说梅西没有得到应有的尊重 他的离队不是好消息 当前快讯
dnf心悦宠物属性大全2021(dnf心悦宠物属性)-天天速讯
当前热讯:沪深股通|中信特钢6月13日获外资卖出2.04万股
简佳:在能源转型背景下 绿氢产业将进入实质性的高速发展阶段
视焦点讯!提示语的三种形式
一种常被扔掉的食物废料,营养却非常丰富
天天微速讯:麦收快讯(20230613)
全球热议:高考生晒未打码准考证,警方:可能被不法分子利用
环球微头条丨德勤调查:菲律宾七成“千禧一代”和六成“Z世代”打两份工
天天热点!贵州著名景点介绍_贵州著名景点
新消息丨这场在川举行的“国字号”会议释放出哪些信号?
特异体质包括哪些 特异体质
天天信息:高炉煤气热值(高炉煤气)
当前短讯!神农投资陈宇:下半年最大的风险是空仓