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个节 ...
随机推荐
- asp.net 邮件发送类
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- JS基本类型和引用类型的值
JS中可以把变量分成两部分,基本类型和引用类型. 基本类型比较简单,包括:Undefined.Null.Boolean.Number和String,基本类型值就是简单的数据段:引用类型值可能由多个值构 ...
- 九度OJ 1410 垒积木 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1410 题目描述: 给你一些长方体的积木,问按以下规则能最多垒几个积木. 1 一个积木上面最多只能垒另一个积木. 2 ...
- java.lang.StringBuffer源码分析
StringBuffer是一个线程安全的可变序列的字符数组对象,它与StringBuilder一样,继承父类AbstractStringBuilder.在多线程环境中,当方法操作是必须被同步,Stri ...
- CSS选择器,标签限定
例子:ul#nav, ul li#nav和 #nav ul, #nav ul li 注意空格,没有空间隔开的就可以理解为限定 区别 1.ul#nav:表示id='nav'的ul:(ul限定#nav标签 ...
- .net Remoting 的工作原理是什么?
webservice和.net remoting都是用来通信的框架,它们最大的优点是可以像调用本地对象一样调用远程对象 区别:1.webservice是用的应用层协议http封装的,所以它可以被很多其 ...
- MVC , MVP , MVVM【转 阮一峰的网络日志】
一.MVC MVC模式的意思是,软件可以分成三个部分. 视图(View):用户界面. 控制器(Controller):业务逻辑 模型(Model):数据保存 各部分之间的通信方式如下. View 传送 ...
- windows下常用快捷键
windows下常用快捷键: 显示桌面: win徽标+D 打开资源管理器: win徽标+E 打开任务管理器: Ctrl+Alt+delete 任务切换: Alt+Tab 应用程序中窗口之间的切换: C ...
- 【WEB-INF】WEB-INF是Java的WEB应用的安全目录
WEB-INF下的东西是禁止直接访问的.如果这个页面是你的,要想让人访问最好不要放在这个目录下.如果一定放在那里.你可以使用:request.getRequestDispatcher("/W ...
- C# foreach 原理以及模拟的实现
public class Person:IEnumerable //定义一个person类 并且 实现IEnumerable 接口 (或者不用实现此接口 直接在类 //里面写个GetEnu ...