区间DP总结

試著忘記壹切 提交于 2020-03-11 13:04:40

一般问题

把相邻符合条件的合并,来获得最优解

概念

区间类型动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。(例:f[i][j]=f[i][k]+f[k+1][j])

区间类动态规划的特点:

合并:即将两个或多个部分进行整合。
特征:能将问题分解成为两两合并的形式。
求解:对整个问题设最优值,枚举合并点,将问题分解成为左右两个部分,最后将左右两个部分的最优值进行合并得到原问题的最优值。

在这里插入图片描述

DP(n^3) DP+四边形不等式优化(n^2)

一般数据500还能跑跑,如果1e3基本凉了,要优化到O(n2),要用到四边形不等式优化。暂时不会,再等等吧,

某博主的证明四边形不等式优化

    cin>>n;
    memset(dp,inf);///初始化dp数组
    for(int i=1;i<=n;++i)
        cin>>a[i],pre[i]=pre[i-1]+a[i],dp[i][i]=0;
    for(int len=1;len<n;++len)///枚举区间长度
    {
        for(int i=1;i+len<=n;++i)///枚举区间起点
        {
            int j=i+len;///根据起点得到合法终点
            for(int k=i;k<j;++k)///枚举最优分割点
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
            dp[i][j]+=pre[j]-pre[i-1];
        }
    }
    cout<<dp[1][n]<<endl;
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!