四边形不等式优化dp学习笔记 [finished 1/2]
摘自
定义 为定义在整数域的二元函数, 若对于定义域上的任何整数 , 满足 , 则称函数 满足 四边形不等式 .
定义 为定义在整数域的二元函数, 若对于定义域上的任何整数 ,
满足 , 则称函数 满足 四边形不等式 .
简记为 交叉小于包含 , 证明略 .
对于形如状态转移方程 , 可以使用 四边形不等式 进行优化.
,
- .
这是根本前提 .
- : 对于任意 , 满足 .
通过前提 , 可以推导出 也满足 四边形不等式, 证明略 .
- 记 表示 的最优决策 , 若前 个前提都满足,
则称 满足 二维决策单调性, 对于任意的 , .
关键. 证明略 .
这道题目满足上述的所有前提, 因此可以使用 四边形不等式 优化,
求解 时, 不再在 中对 进行暴力枚举, 而是在 中对 进行枚举,
时间复杂度计算: .
特别地, .
注意环状处理 .
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
const int maxn = 5005;
int N;
int A[maxn];
int p[maxn][maxn];
ll sum[maxn];
ll F[maxn][maxn];
int main(){
scanf("%d", &N);
memset(F, 0x3f, sizeof F);
for(reg int i = 1; i <= N; i ++) scanf("%d", &A[i]), A[i+N] = A[i];
for(reg int i = 1; i <= N<<1; i ++) sum[i] = sum[i-1] + A[i], p[i][i] = i, F[i][i] = 0;
for(reg int len = 2; len <= N; len ++)
for(reg int i = 1; i+len-1 <= N<<1; i ++){
int j = i+len-1;
for(reg int k = p[i][j-1]; k <= p[i+1][j]; k ++){
ll t = F[i][k] + F[k+1][j] + sum[j] - sum[i-1];
if(t < F[i][j]) F[i][j] = t, p[i][j] = k;
}
}
ll Ans = F[0][0];
for(reg int i = 1; i <= N; i ++) Ans = std::min(Ans, F[i][i+N-1]);
printf("%lld\n", Ans);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥