一般问题
把相邻符合条件的合并,来获得最优解
概念
区间类型动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。(例: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;
来源:CSDN
作者:玛咖二锅头
链接:https://blog.csdn.net/weixin_44224825/article/details/104791574