当前位置:   article > 正文

蓝桥杯DP算法——区间DP(C++)

蓝桥杯DP算法——区间DP(C++)

根据题意要求的是将石子合并的最小权值,我们可以根据DP思想使用二维数组f[i,j]来存放所有从第i堆石子到第j堆石子合并成一堆石子的合并方式。

然后由第二个图所示,我们可以将i到j区间分成两个区间,因为将i到j合并成一个区间的前一步一定是合并前两个区间。因此我们可以将状态计算的递归定义为区间的中间,通过变化区间的中间来寻找合并i到j的最小值

也就是f[i,j]=min(f[i,k]+f[k+1,j]+s[j]-s[i-1]

例题:https://www.acwing.com/problem/content/284/ 

  1. #include<iostream>
  2. using namespace std;
  3. const int N=310;
  4. int n;
  5. int f[N][N];
  6. int s[N];
  7. int main()
  8. {
  9. cin>>n;
  10. int a;
  11. for(int i=1;i<=n;i++) //前缀和
  12. {
  13. scanf("%d",&a);
  14. s[i]=s[i-1]+a;
  15. }
  16. for(int len=2;len<=n;len++)
  17. {
  18. for(int i=1;i+len-1<=n;i++)
  19. {
  20. int l=i ,r=i+len-1;
  21. f[l][r]=1e8;
  22. for(int k=l;k<r;k++)
  23. {
  24. f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
  25. }
  26. }
  27. }
  28. cout<<f[1][n];
  29. return 0;
  30. }

k的取值范围:

这里划分出的区间是[l, k], [k+1, r]

说明: [l, l] [r, r] 这两个区间都是不为空的,至少包含了一堆石子。

前提:划分出的两个区间都不为空的情况下,讨论k的取值范围

所以,对于[l, k] k可以取到 l 对于[k+1, r] , 因为k+1 <= r, 所以 k <= r - 1, 即 k < r

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/143963
推荐阅读
相关标签
  

闽ICP备14008679号