【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 ...
随机推荐
- webservice 注解介绍
JAX-WS 注释 “基于 XML 的 Web Service 的 Java API”(JAX-WS)通过使用注释来指定与 Web Service 实现相关联的元数据以及简化 Web Service ...
- CSS3实现鼠标悬停扩展效果
我们在做导航标签的时候,有时会出现空间过于拥挤需要隐藏部分内容的情况,所以在这里我自己写了一个鼠标悬停显示扩展内容的效果,如下图所示. 总的来说效果还是比较好实现,但是比较头疼的是三角部分使用了伪元素 ...
- 表单提交前的confirm验证提示
今天要做一个修改提交前的提示,点击修改按钮进行提示,然后根据confirm的结果来决定是否提交;发现平时很常见的一个功能,自己不会.所以只能去晚上找资料了; 举例如下: <form action ...
- XML入门介绍(什么是XML及XML格式)
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language). XML 是一种很像HTML的标记语言. XML 的设计宗旨是传输数据,而不是显示数据. XML 标 ...
- Hibernate中的session的线程安全问题
SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一 个SessionFactory并从中获取Session实例, 而Session不是线程安全的,Session中包含了数 据 ...
- Supper关键字
java中的super关键字是一个引用变量,用于引用直接父类对象. 每当创建子类的实例时,父类的实例被隐式创建,由super关键字引用变量引用. java super关键字的用法如下: super可以 ...
- PHP性能检测与优化—XHProf 数据阅读
PHP性能检测与优化—XHProf 数据阅读 一. 效果如下 请求总揽 函数调用情况 二. 参数含义 Inclusive Time 包括子函数所有执行时间 ...
- html5 填表 表单 input output 与表单验证
1.<output> Js计算结果 <form oninput="res.value = num1.valueAsNumber*num2.valueAsNumber ...
- Python爬虫实战:将网页转换为pdf电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
- 菜鸟学习Spring——SpringIoC容器基于三种配置的对比
一.概述 对于实现Bean信息定义的目标,它提供了基于XML.基于注解及基于java类这三种选项.下面总结一下三种配置方式的差异. 二.Bean不同配置方式比较. 三.Bean不同配置方式的适用场合. ...