区间型动态规划的典型例题是石子归并,同时使用记忆化搜索实现区间动归是一种比较容易实现的方式,避免了循环数组实现的时候一些边界的判断

n堆石子排列成一条线,我们可以将相邻的两堆石子进行合并,合并之后需要消耗的代价为这两堆石子的质量之和,问最小的合并代价

状态转移方程很容易给出:

  1. f[i][j]=min(f[i][j],f[i][k]+f[k+][j]+sum[i][j])

因为要计算区间和,考虑前缀和进行预处理

然后我们给出用记忆化搜索形式实现的代码,这里的记忆化搜索形式可以作为后续问题的一个模板

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int INF=0x3f3f3f3f;
  6. const int maxn=;
  7. int n;
  8. int w[maxn];
  9. int g[maxn]; //前缀和
  10. int f[maxn][maxn];
  11. int dfs(int l,int r)
  12. {
  13. if(l==r) return ;
  14. if(f[l][r]!=INF)
  15. return f[l][r];
  16. int tmp=INF;
  17. for(int i=l;i<r;i++)
  18. tmp=min(tmp,dfs(l,i)+dfs(i+,r)+g[r]-g[l-]);
  19. if(tmp<f[l][r])
  20. f[l][r]=tmp;
  21. return f[l][r];
  22. }
  23. int main()
  24. {
  25. cin>>n;
  26. for(int i=;i<=n;i++)
  27. {
  28. cin>>w[i];
  29. g[i]=g[i-]+w[i];
  30. }
  31. for(int i=;i<=n;i++)
  32. for(int j=;j<=n;j++)
  33. f[i][j]=0x3f3f3f3f;
  34. cout<<dfs(,n)<<endl;
  35. return ;
  36. }

这个问题还是比较显然的,我们考虑另一个问题,那就是环形动态规划

其实环形动态规划也是区间型,只不过区间首尾相接

此时使用记忆化搜索实现,其实是不容易的

典型例题是能量项链

先给出状态转移方程:

  1. f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[i]*a[j]*a[k])

由于每一种区间问题的价值计算方式不一样,可能采用不同的优化形式,本题直接计算即可

然后我们给出使用循环数组方式实现的一个固定的格式,所有的区间型动态规划都可以采取这样的形式来实现

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. const int maxn=;
  5. int n;
  6. int a[maxn];
  7. long long ans=;
  8. int f[maxn][maxn];
  9. void dp()
  10. {
  11. for(int l=;l<=n;l++) //区间长度
  12. for(int i=;i<=n*-l+;i++) //区间起点
  13. {
  14. int j=i+l; //区间终点
  15. for(int k=i+;k<=j-;k++) //区间中任意点
  16. f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[i]*a[j]*a[k]);
  17. }
  18. for(int i=;i<=n;i++)
  19. if(ans<f[i][i+n])
  20. ans=f[i][i+n];
  21. }
  22. int main()
  23. {
  24. cin>>n;
  25. for(int i=;i<=n;i++)
  26. {
  27. cin>>a[i];
  28. a[n+i]=a[i];
  29. }
  30. dp();
  31. cout<<ans;
  32. return ;
  33. }

分别枚举区间的长度,区间的起点和区间中的任意点就好了

动态规划:区间DP与环形DP的更多相关文章

  1. 区间DP中的环形DP

    vijos1312 链接:www.vijos.org/p/1312 题目分析:经典的环形DP(区间DP) 环形DP,首先解环过程,把数组复制一遍,n个数变成2n个数,从而实现解环 dp[i][j]表示 ...

  2. 动态规划——区间dp

    在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...

  3. Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:前面有n头狼并列排成一排, 每一头狼都有两个属性--基础攻击力和buff加成, 每一头 ...

  4. Light OJ 1025 - The Specials Menu(动态规划-区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 题目大意:一串字符, 通过删除其中一些字符, 能够使这串字符变成回文串. ...

  5. 模板 - 动态规划 - 区间dp

    因为昨天在Codeforces上设计的区间dp错了(错过了上紫的机会),觉得很难受.看看学长好像也有学,就不用看别的神犇的了. 区间dp处理环的时候可以把序列延长一倍. 下面是 $O(n^3)$ 的朴 ...

  6. 洛谷P1063 能量项链(区间DP)(环形DP)

    To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...

  7. [SCOI2007]压缩(动态规划,区间dp,字符串哈希)

    [SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...

  8. P1880 [NOI1995]石子合并[环形DP]

    题目来源:洛谷 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将 ...

  9. DP中环形处理 +(POJ 1179 题解)

    DP中环形处理 对于DP中存在环的情况,大致有两种处理的方法: 对于很多的区间DP来说,很常见的方法就是把原来的环从任意两点断开(注意并不是直接删掉这条边),在复制一条一模一样的链在这条链的后方,当做 ...

随机推荐

  1. Python决定一个变量时局部的,还是全局的,是在编译期

    Python中的变量名是在编译时就解析好的,换句话说,在编译时(也就是在交互控制台输入代码是或者import文件时),Python就已经决定一个变量应该是局部变量,还是全局变量.来看下面的例子: &g ...

  2. Cow Contest(最短路floyed传递闭包)

    Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...

  3. node.js安装部署

    node  js  安装部署学习 CentOS 下安装 Node.js 1.下载源码,你需要在https://nodejs.org/en/download/下载最新的Nodejs版本,链接: http ...

  4. ajax 返回值问题

    错误示例:function returnFlag(){ $.ajax({ type:"post", dataType:"json", data:JSON.str ...

  5. LintCode-35.翻转链表

    翻转链表 翻转一个链表 样例 给出一个链表 1->2->3->null ,这个翻转后的链表为 3->2->1->null 挑战 在原地一次翻转完成 标签 链表 优步 ...

  6. Android出现:Your project path contains non-ASCII characters.

    导入Project的出现: Error:(1, 0) Your project path contains non-ASCII characters. This will most likely ca ...

  7. 【SQLAlchemy】SQLAlchemy修改查询字段列名

    SQLAlchemy问题记录 company price quantity Microsoft Google Google Google 要实现脚本 select price, sum(quantit ...

  8. BZOJ 1082 栅栏(二分+DFS剪枝)

    首先,长度短的木板一定比长度长的木板容易得到,因此若要得到最多的木板,它们必定是所有木板中最短的——可以对木板排序后二分答案(用k表示). 判断是否合法就用搜索,但数据有点大,要用到两个剪枝.一个是若 ...

  9. InnoDB实现MVCC原理

    ​ MVCC(Multi-Version Concurrent Control),即多版本并发控制,通过保存数据在某个时间点的快照来实现,因此每个读操作都会看到一个一致性的视图,并且可以实现非阻塞的读 ...

  10. 【刷题】BZOJ 3510 首都

    Description 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从 ...