【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 ...
随机推荐
- TOJ 2733 棋盘游戏
Description 小 希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是 Gardon限制了只有某些格子才 ...
- springboot 之 使用jetty web容器
springboot 中默认的web容器是tomcat. 在maven 的pom 文件中加入如下依赖,便可使用tomcat 容器. <dependency> <groupId> ...
- nyoj 61——传纸条(一)——————【双线dp】
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- 彻底消除wine中文乱码,QQ,kugoo等等....
原文链接:http://forum.ubuntu.org.cn/viewtopic.php?t=290155 lendylongli wine下中文的配置方案步骤:1. 初始设置运行 winecfg, ...
- Javascript: hash tables in javascript
/** * Copyright 2010 Tim Down. * * Licensed under the Apache License, Version 2.0 (the "License ...
- Android滑动删除功能
今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. ...
- AE常用代码(标注要素、AE中画带箭头的线、如何获得投影坐标、参考坐标、投影方式、FeatureCount注意事项)
手上的电脑已经用了将近三年了,想入手一台Surface Pro,所以计划着把电脑上的资料整理下,部分资料打算发到博客上来,资料有同事.也有自己的.也有来自网络的,来源途径太多,也没法详细注明,请见谅! ...
- XP无法访问SharePoint 2010的问题
最近用户反馈XP系统的电脑无法访问SharePoint 2010系统,换成了火狐浏览器后可以正常访问,但是在上传附件时出现异常,支持人员给的解决方案是换操作系统,要换成win7. 但是因为工作原因,不 ...
- 【css基础】html图片右上角加上删除按钮
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Selenium2学习(七)-- 定位一组元素find_elements
前言 前面的几篇都是讲如何定位一个元素,有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象. webdriver 提供了定位一组元素的方法,跟前面八种定位方式 ...