动态规划:区间DP与环形DP
区间型动态规划的典型例题是石子归并,同时使用记忆化搜索实现区间动归是一种比较容易实现的方式,避免了循环数组实现的时候一些边界的判断
n堆石子排列成一条线,我们可以将相邻的两堆石子进行合并,合并之后需要消耗的代价为这两堆石子的质量之和,问最小的合并代价
状态转移方程很容易给出:
f[i][j]=min(f[i][j],f[i][k]+f[k+][j]+sum[i][j])
因为要计算区间和,考虑前缀和进行预处理
然后我们给出用记忆化搜索形式实现的代码,这里的记忆化搜索形式可以作为后续问题的一个模板
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=;
int n;
int w[maxn];
int g[maxn]; //前缀和
int f[maxn][maxn];
int dfs(int l,int r)
{
if(l==r) return ;
if(f[l][r]!=INF)
return f[l][r];
int tmp=INF;
for(int i=l;i<r;i++)
tmp=min(tmp,dfs(l,i)+dfs(i+,r)+g[r]-g[l-]);
if(tmp<f[l][r])
f[l][r]=tmp;
return f[l][r];
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>w[i];
g[i]=g[i-]+w[i];
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
f[i][j]=0x3f3f3f3f;
cout<<dfs(,n)<<endl;
return ;
}
这个问题还是比较显然的,我们考虑另一个问题,那就是环形动态规划
其实环形动态规划也是区间型,只不过区间首尾相接
此时使用记忆化搜索实现,其实是不容易的
典型例题是能量项链
先给出状态转移方程:
f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[i]*a[j]*a[k])
由于每一种区间问题的价值计算方式不一样,可能采用不同的优化形式,本题直接计算即可
然后我们给出使用循环数组方式实现的一个固定的格式,所有的区间型动态规划都可以采取这样的形式来实现
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=;
int n;
int a[maxn];
long long ans=;
int f[maxn][maxn];
void dp()
{
for(int l=;l<=n;l++) //区间长度
for(int i=;i<=n*-l+;i++) //区间起点
{
int j=i+l; //区间终点
for(int k=i+;k<=j-;k++) //区间中任意点
f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[i]*a[j]*a[k]);
}
for(int i=;i<=n;i++)
if(ans<f[i][i+n])
ans=f[i][i+n];
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i];
a[n+i]=a[i];
}
dp();
cout<<ans;
return ;
}
分别枚举区间的长度,区间的起点和区间中的任意点就好了
动态规划:区间DP与环形DP的更多相关文章
- 区间DP中的环形DP
vijos1312 链接:www.vijos.org/p/1312 题目分析:经典的环形DP(区间DP) 环形DP,首先解环过程,把数组复制一遍,n个数变成2n个数,从而实现解环 dp[i][j]表示 ...
- 动态规划——区间dp
在利用动态规划解决的一些实际问题当中,一类是基于区间上进行的,总的来说,这种区间dp是属于线性dp的一种.但是我们为了更好的分类,这里仍将其单独拿出进行分析讨论. 让我们结合一个题目开始对区间dp的探 ...
- Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:前面有n头狼并列排成一排, 每一头狼都有两个属性--基础攻击力和buff加成, 每一头 ...
- Light OJ 1025 - The Specials Menu(动态规划-区间dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 题目大意:一串字符, 通过删除其中一些字符, 能够使这串字符变成回文串. ...
- 模板 - 动态规划 - 区间dp
因为昨天在Codeforces上设计的区间dp错了(错过了上紫的机会),觉得很难受.看看学长好像也有学,就不用看别的神犇的了. 区间dp处理环的时候可以把序列延长一倍. 下面是 $O(n^3)$ 的朴 ...
- 洛谷P1063 能量项链(区间DP)(环形DP)
To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...
- [SCOI2007]压缩(动态规划,区间dp,字符串哈希)
[SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...
- P1880 [NOI1995]石子合并[环形DP]
题目来源:洛谷 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将 ...
- DP中环形处理 +(POJ 1179 题解)
DP中环形处理 对于DP中存在环的情况,大致有两种处理的方法: 对于很多的区间DP来说,很常见的方法就是把原来的环从任意两点断开(注意并不是直接删掉这条边),在复制一条一模一样的链在这条链的后方,当做 ...
随机推荐
- JQuery中each方法实现
each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象.数组的属性值并进行处理. jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单 ...
- NFC进场通信总结概述
简介 本文介绍Nokia设备所支持的近场通信技术(NFC)及相关的功能.旨在为使用 Qt/Symbian/Java™ API为Nokia手机开发应用的开发者 刚开始接触NFC开发时提供有用的信息. 什 ...
- 20172330 2017-2018-1 《Java程序设计》第八周学习总结
学号 2017-2018-1 <程序设计与数据结构>第八周学习总结 教材学习内容总结 这一章主要是对多态性的学习: 由继承实现多态性 多态性引用能够随时间变化指向不同类型的对象. 对于多态 ...
- 团队作业7——第二次项目冲刺(Beta版本)-第二篇
1.工作分工: 团队成员 分工 郭达22120 项目整合,后台代码 刘德培44060 数据库模块 石浩洋22061 前台界面优化 曾繁钦22056 前台界面优化.测试 孙斌22030 后台代码 2.燃 ...
- OSG数学基础:坐标系变换
三维实体对象需要经过一系列的坐标变换才能正确.真实地显示在屏幕上.在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的. 坐标系变换通常包括:世界坐标系-物体坐标系变换. ...
- Linux面试题汇总答案(转)
转自:小女生的Linux技术~~~Linux面试题汇总答案~~ 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的 ...
- 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
- 威锋网(Weiphone) BBS排序插件
body,td,p { // 这对大括号里描述网页的背景 margin-left:40px; margin-right:40px; font-size: 10pt; } div.vim { width ...
- Atom Editor 插件 atom-less 的使用方法
一.下载安装 atom-less atom-less 项目在这里:https://github.com/schmuli/atom-less 安装方法请参考这篇博文:http://blog.csdn.n ...
- 如何正确实现Page接口分页,用PageImpl 自定义分页
/** * Constructor of {@code PageImpl}. * * @param content the content of this page, must not be {@li ...