石子合并(一圈)四边形不等式优化

题目链接

https://www.luogu.com.cn/problem/P1880

普通dp题解链接

https://blog.nowcoder.net/n/420fe9ffda304281ad58f7abc03fb107

四边形不等式优化

很显然,直接区间dp板子搞上的时间复杂度为n^3,n到1000就TLE了。
通过四边形不等式优化可以将时间复杂度降至n^2。
我不会证明,能背过结论就不错了,WTCL。
结论:记住吧我还是
求最小值可以使用四边形不等式优化,但是求最大值不行,因为求最大值不满足某些条件。
但是最大值的最优决策要么是k=i,要么是k=j-1,所以一个max(dp[i][i]+dp[i+1][j],dp[i][j-1]+dp[j][j])+sum[j]-sum[i-1]就求出了最大值(并非最终结果的最大值)。
当问题是最小值时,我们就可以用四边形不等式优化了。此时,对于dp[i][j],我们只需要在区间[ best[i][j−1],best[i+1][j] ]枚举k即可,时间复杂度为O(n^2)。
至于如何刷新best的值,看代码吧(挺简单的),我还是不知道咋证明。

参考大佬的题解链接

大佬本题题解
关于四边形优化的证明挺多的,但是我都没看懂,就上面这个大佬的结论比较清楚。
这还有个板子,不过讲的不是很清楚,理解了之后再看比较好

AC代码

#include<bits/stdc++.h>
#define sc(x) scanf("%d",&x)
#define pr(x) printf("%d",x)
#define ll long long
using namespace std;
const int N=300;
const int inf=0x3f3f3f3f;
int n,sum[N],mn[N][N],mx[N][N],a[N],best[N][N];
int maxx,minn=inf;
int main(){
    sc(n);
    for(int i=1;i<=n;i++) sc(a[i]),sum[i]=sum[i-1]+a[i],best[i][i]=i;
    for(int i=1;i<=n;i++) sum[i+n]=sum[i+n-1]+a[i],best[i+n][i+n]=i+n;//best要初始化,就是将best[i][i]初始化为i

    for(int len=2;len<=n;len++)
        for(int L=1;L<n+n;L++){
            int R=L+len-1;
            if(R>n+n) break;

            mn[L][R]=inf;
            for(int M=best[L][R-1];M<=best[L+1][R];M++){
                if(mn[L][R]>mn[L][M]+mn[M+1][R]+sum[R]-sum[L-1]){
                    best[L][R]=M;//刷新最小值的同时刷新best
                    mn[L][R]=mn[L][M]+mn[M+1][R]+sum[R]-sum[L-1];
                }    
            }

            mx[L][R]=max(mx[L][L]+mx[L+1][R],mx[L][R-1]+mx[R][R])+sum[R]-sum[L-1];
        }

    for(int i=1;i<=n;i++){
        maxx=max(maxx,mx[i][i+n-1]);
        minn=min(minn,mn[i][i+n-1]);
    }

    pr(minn);printf("\n");pr(maxx);
} 
全部评论

相关推荐

鸿雁于飞:1. 求职定位乱成一锅粥,直接劝退HR 你期望职位同时写了「项目经理/技术经理/交付经理」,这仨岗根本不是一个赛道!项目经理玩流程和干系人,技术经理玩架构和带技术团队,交付经理玩客户和回款,你仨全堆上,HR直接判定「这人自己都不知道自己要干啥,没核心竞争力」,直接扔简历。 ​ 2. 2年多的职业空窗期,一个字不提,纯纯自杀行为 金融行业最看重职业连贯性和背景干净,你2018年5月到2020年8月,整整2年3个月没上班,啥说明都没有!HR直接脑补你是不是有竞业限制、是不是创业失败、是不是有啥背调过不了的问题,直接不敢往下看,首轮就给你筛了,这是最致命的坑! ​ 3. 工作经历纯纯摆烂,干货全藏起来了 你每段工作就写个公司、职位、时间,干了啥、带了多大团队、出了啥核心成果、给公司赚了/省了多少钱,一个字没有,全堆到后面的项目里了。HR看简历就3秒,第一眼看不到你每段工作的价值,直接就划走了,根本不会翻你后面的项目。 ​ 4. 项目经验像个大杂烩,还全是bug 你堆了快10个项目,银行、证券、公安、政务、日本项目啥都有,跟个杂货铺一样,HR根本看不到你的核心优势在哪。而且项目连个起止时间都不写,谁知道你这是最近的标杆项目,还是10年前刚入行干的活?还有数据前后矛盾,一会说「零事故交付」,一会说「生产事故率降低50%」,HR一看就觉得你瞎包装,根本不信。 ​ 5. 15年经验的经理岗,还在写一线拧螺丝的活,层级完全错配 你都应聘经理级岗位了,简历里还在写自己写接口、写测试脚本、做前端开发这些一线执行的活,完全没写你怎么搭建管理体系、怎么带团队、怎么搞定甲方、怎么控项目风险、怎么拿经营结果,MBA的价值一点没体现出来。HR看完直接觉得:合着你干了15年,还是个高级开发,根本达不到经理岗的要求,直接pass。 ​ 6. AI风口完全没抓住,写了句空话等于没写 现在全行业都在卷AI+金融,人家招管理岗,都要能落地AI场景的人。你就写了句「深化Transformer与大模型底层技术研习」,纯纯空话,一点实际落地成果都没有,跟其他候选人比,完全没差异化优势,人家凭啥放着年轻能落地的不要,要你这个只学了理论的? 姐好好看看,然后改改简历吧,要专,要精,然后降低求职目标。希望你能早日拿到offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务