VJP1100 加分二叉树(树形DP)
归属树形DP 做着更像记忆化
DP很好做 就是那个输出路径恶心了。。改代码 从60多行改到120多行。。dp从1维加到三维。。
先类似记忆化搜索整棵树 枚举以i为根节点的最大值 子树类似
求完最大值 再递归搜一下前序 这题不记忆化会超时
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define LL long long
LL dp[][][],a[];
int n,path[],to;
LL dfs(int root,int l,int r)
{
if(dp[root][l][r])
return dp[root][l][r];
if(l==r)
return dp[root][l][r] = a[l];
int i,j;
LL tt =;
if(l==root)
{
for(i = root+ ; i <= r ; i++)
tt = max(tt,dfs(i,root+,r)+a[root]);
}
else if(r==root)
{
for(i = l ; i < root ; i++)
tt = max(tt,dfs(i,l,root-)+a[root]);
}
else
{
for(i = l; i < root ; i++)
for(j = root+ ; j <= r; j++)
{
LL s1 = dfs(i,l,root-);
LL s2 = dfs(j,root+,r);
tt = max(tt,s1*s2+a[root]);
}
}
return dp[root][l][r]=tt;
}
void find(int u,int l,int r,int v)
{
int i,j,x1,x2;
if(l==r)
return ;
int f = ;
if(u==l)
{
for(i = u+ ; i <= r ; i++)
if(dp[i][u+][r]+a[u]==dp[u][l][r])
{
x1 = i;
break;
}
path[v+] = x1;
find(x1,u+,r,v+);
}
else if(u==r)
{
for(i = l ; i < u ; i++)
if(dp[i][l][u-]+a[u]==dp[u][l][r])
{
x1 = i;
break;
}
path[v+] = x1;
find(x1,l,u-,v+);
}
else
{
for(i = l; i < u ; i++)
{
for(j = u+; j <= r ;j++)
if(dp[i][l][u-]*dp[j][u+][r]+a[u]==dp[u][l][r])
{
x1 = i;
x2 = j;
f = ;
break;
}
if(f) break;
}
path[v+] = x1;
path[v++u-l] = x2;
find(x1,l,u-,v+);
find(x2,u+,r,v++u-l);
}
}
int main()
{
int i;
cin>>n;
for(i = ; i <= n ; i++)
cin>>a[i];
LL ans = ;
for(i = ; i <= n ; i++)
{
LL s = dfs(i,,n);
if(s>ans)
{
ans =s;
path[] = i;
}
}
cout<<ans<<endl;
find(path[],,n,);
for(i = ; i < n ; i++)
cout<<path[i]<<" ";
cout<<path[n]<<endl;
return ;
}
VJP1100 加分二叉树(树形DP)的更多相关文章
- 洛谷P1040 加分二叉树(区间dp)
P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di, ...
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 659 Solved: 469[Submit][Status] ...
- 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...
- [luogu2585 ZJOI2006] 三色二叉树 (树形dp)
传送门 Description Input 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件名:TRO.OUT 输出文件也只有一行,包 ...
- cogs 106. [NOIP2003] 加分二叉树(区间DP)
106. [NOIP2003] 加分二叉树 ★☆ 输入文件:jfecs.in 输出文件:jfecs.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 设 一个 n ...
- [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
题意 给定一颗二叉树的头节点,已知所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这个树的头节点. 题解 在后序遍历过程中实现. 求解步骤按树形dp中所列步骤.可能性三种:左子树最大.右子 ...
- 洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P2585 首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反: 一开始因为懒得还原出树,所以写 ...
- [Swust OJ 360]--加分二叉树(区间dp)
题目链接:http://acm.swust.edu.cn/problem/360/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- P1040 加分二叉树 区间dp
题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...
随机推荐
- 方法 :PHP开发环境搭建(phpstorm + xampp+mongodb)
phpstorm 安装下载 百度网盘资源 phpstorm 9.0.1(有序列号) http://pan.baidu.com/s/1kTvX0jl xampp 安装下载 ...
- Python Numpy
ebook on quant trading /量子交易 參考: Python在Windows下的安裝可以使用Python(x,y).
- Blu-Ray BRRip 和 BDRip 的区别
Blu-Ray BRRip & BDRip 的区别 最近看电影有点多,常常看到blueray或者BDRip的格式,所以找了一下这两种格式的区别. BRRip = 来自蓝光盘片的xvid编码 B ...
- C# IO流的操作
C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 { class P ...
- python 数据类型(列表)学习笔记
列表 创建列表: name_list = ['alex', 'seven', 'eric'] 或 name_list = list(['alex', 'seven', 'eric']) 其实今天学习的 ...
- 【加密】C#.NET 各种加密解密
包括:AES/DES/Base64/RSA/MD5/SHA256 http://www.sosuo8.com/article/show.asp?id=3083 http://blog.csdn.net ...
- CentOS 6.6x64下编译gcc-4.7.4
最近使用老版本的gcc发现一些问题,于是想尝试升级. 看了一些教程之后进行尝试,发现各类教程均会有一些小问题,于是在此记录一下本人的过程. 编译过程中参考的文章有如下几篇,在此表示感谢: http:/ ...
- java Servlet导出数据到Excel文件
package com.lbc.excel.servlet; import java.io.IOException; import java.util.ArrayList; import java.u ...
- linux之vim编辑器
Vi简介1. Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序.2. Vi不是排版程序,只是一个纯粹的文本编辑程序.3. Vi是全屏幕文本编辑器,它没有菜单,只有命令.4. Vi不是基 ...
- 关于ASE日志空间示数不正常的解决办法
最近某系统的ASE数据库出现了异常,经过各种努力,终于把数据库正常又起起来了.但是经过检查,发现在查看剩余日志空间的时候(sp_helpsegment 'logsegment'),发现显示出来 ...