【luogu P1040 加分二叉树】 题解
题目链接:https://www.luogu.org/problemnew/show/P1040
今天考试考了一个区间DP...没错就是这个...
太蒟了真是连区间DP都不会...看了看题解也看不懂,于是请了某獴dalao给补充了一下。
在这里把自己的理解写下来,算是给一些像我一样不会区间DP的萌新们一点指引。
所谓区间dp,顾名思义就是在一段区间上的动态规划。
它既要满足dp问题的最优子结构和无后效性外,还应该符合在区间上操作的特点。我们是用小区间的最优推出大区间的最优。
通常我们是拿f[i][j]表示区间i—j。在这个题中,我们就用f[i][j]表示区间i—j的最大权值。
对于区间DP,我们通常是一层循环枚举区间的长度,一层循环枚举区间的左端点。然后进行我们需要的DP就行了。
具体对这个题的做法代码里有注释。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, v[31], f[31][31], root[31][31], l, r;
void print(int l, int r)
{
if(l > r) return;
printf("%d ",root[l][r]);
print(l, root[l][r]-1);
print(root[l][r]+1,r);
}
int main()
{
//freopen("binary.in","r",stdin);
//freopen("binary.out","w",stdout);
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&v[i]);
f[i][i] = v[i];//当只有自己的时候,最大就是自己
root[i][i] = i;//root[i][j]表示在区间i—j中,以哪个点作为根得到的权值最大。
}
for(int k = 2; k <= n; k++)//枚举区间大小
for(int l = 1; l+k-1 <= n; l++)//枚举区间内的端点
{
r = l+k-1;
if(f[l][r] < v[l]+f[l+1][r])
{
f[l][r] = v[l]+f[l+1][r];
root[l][r] = l;
}//右子树为空,只有左子树 的情况
if(f[l][r] < v[r]+f[l][r-1])
{
f[l][r] = v[r]+f[l][r-1];
root[l][r] = r;
}//左子树为空,只有右子树 的情况
for(int i = l+1; i <= r-1; i++)
{
if(f[l][i-1]*f[i+1][r]+v[i] > f[l][r])
{
f[l][r] = f[l][i-1]*f[i+1][r]+v[i];
root[l][r] = i;
}
}//左右子树均不为空
}//整个是在枚举在一段区间内,分别以每个点做根的情况
printf("%d\n",f[1][n]);//很明显我们所求的是1—n区间
print(1,n);//输出路径不多讲了
return 0;
}
【luogu P1040 加分二叉树】 题解的更多相关文章
- luogu P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- 洛谷P1040 加分二叉树题解
dp即可 \(f[i][j]\)表示i到j的加分 相当于区间dp了 #include<cstdio> using namespace std; int v[50]; int f[55][5 ...
- CJOJ 1010【NOIP2003】加分二叉树 / Luogu 1040 加分二叉树(树型动态规划)
CJOJ 1010[NOIP2003]加分二叉树 / Luogu 1040 加分二叉树(树型动态规划) Description 设 一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,-, ...
- 【洛谷】P1040 加分二叉树
[洛谷]P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数 ...
- 洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- P1040 加分二叉树
转自:(http://www.cnblogs.com/geek-007/p/7197439.html) 经典例题:加分二叉树(Luogu 1040) 设一个 n 个节点的二叉树 tree 的中序遍历为 ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- 【算法•日更•第十期】树型动态规划&区间动态规划:加分二叉树题解
废话不多说,直接上题: 1580:加分二叉树 时间限制: 1000 ms 内存限制: 524288 KB提交数: 121 通过数: 91 [题目描述] 原题来自:NOIP 20 ...
随机推荐
- Spark-HBase集成错误之 java.lang.NoClassDefFoundError: org/htrace/Trace
在进行Spark与HBase 集成的过程中遇到以下问题: java.lang.IllegalArgumentException: Error while instantiating 'org.apac ...
- 关于eclipse添加自动查找文件以及svn的插件
1.添加自动查找当前文件位置的插件(如下图) 在百度搜索下载 OpenExplorer_1.5.0.v201108051313.jar,下载之后放入eclipse下面的plugin文件夹下面既可以 2 ...
- 记一次坑爹的jconsole使用
之前一直是用jstat来监控GC的,后来发现原来有个自带的jconsole,是可始化界面的,而且也是oracle公司自带的工具,与是拿来用一下,发现蛮好用的. 然而,在一次复现实验中,发现原来能复现的 ...
- HDU 5635 ——LCP Array ——————【想法题】
LCP Array Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- UiPath进阶
最近RPA比较火,UiPath工具排名前几位并且免费试用,很多朋友们都选择了学习自动化工具UiPath,今天我就向大家介绍一下UiPath的学习过程,希望对后来的学习这个工具的人有所帮助. UiPat ...
- 10、选择框:ion-select
!重点 multiple="true" 控制 选择框是 多选还是单选.true为 多选类似 checkbox. /* ---html----*/ <ion-content p ...
- continue break return
ontinue: 可以让程序跳过,continue关键字之后的语句,回到while循环的第一行命令 break: 让程序完全跳出循环,结束while循环的执行 return: 从查询或过程中无条件退出 ...
- link快捷方式
ln -s 源文件 newfile -软连接 ln 源文件 newfile 硬链接 源文件删除之后仍然可以使用
- hdu 3255 体积并
http://www.cnblogs.com/kane0526/archive/2013/03/07/2948446.html http://blog.csdn.net/acdreamers/arti ...
- $smarty->assign('','')查询结果发送给模板
$article = one("select * from article WHERE id = '$id'"); $smarty->assign('abc(随便定义)',' ...