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个节 ...
随机推荐
- 记个maven无法识别JAVA_HOME的问题 Error: JAVA_HOME is not defined correctly.
Error: JAVA_HOME is not defined correctly. We cannot execute /Library/Java/JavaVirtualMachines/jdk1. ...
- Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...
- Openstack 目录
[一] OpenStack 基础环境 [二] OpenStack 认证服务 KeyStone [三] OpenStack 镜像服务 Glance [四] OpenStack 计算服务 Nova [五] ...
- ubuntu12.04 U盘自动挂载配置
Ubuntu12.04禁止U盘等设备的自动挂载方法如下: 在图形界面(字符界面无效)内进入系统终端,ctrl+alt+T或者gnome-terminal 禁止自动挂载:$ gsettings seto ...
- source和.命令的区别
source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . .bash_rc 是等效 ...
- ios中XPath的语法
在XML的读写中,我们知道有Xpath的语法 1.定位节点:(/)代表绝对的路径,代表起始地位置.(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来 2.KissX ...
- jquery ajax php+mysql 无刷新分页 详细实例
最近在接触jquery和ajax,当前项目也会用到分页,为了用户体验更好一些,就准备用无刷新分页,这个demo很适合新手学习查看,写的比较清晰,话不多说,直接上代码吧. 首先是html页面,index ...
- DZ升级到X3.2后,UCenter用户管理中心进不了了
前天将DZ升级到X3.2后,UCenter用户管理中心进不了了,输入的密码也对,验证码也对,就是点登录后没反应,又回来输入前的状态.如果更换密码后,显示密码错误,证明密码是没错的.但就是进不了.大家看 ...
- ajax、json一些整理(3)
写上面那些都是因为对ajax不熟悉 从w3c抄写JS原生ajax的东西补充一些基础 XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支持 XM ...
- Memcached服务器安装、配置、使用详解
管理memcached服务 启动Memcached 一般情况下,简单地可以使用类似如下形式,启动Memcached服务: /usr/local/bin/memcached -d -m 64 -I 20 ...