区间dp-洛谷P1040 加分二叉树
来源:互联网 发布:待遇 知乎 编辑:程序博客网 时间:2024/05/19 18:46
https://www.luogu.org/problem/show?pid=1040
怎么看都是树形dp;
后来看来题解,发现对于任何一段中序遍历,都可以组成一颗子树;
先序遍历:根左右
中:左根右
右:左右根;
其实我们枚举根就可以了;
设x~y区间的根节点为k
那么f[x][y]=a[k]+f[x][k-1]*f[k+1][y];
这就是中序遍历的特点啊;
然后输出方案么,记录一下区间的更不就好了吗;
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define Ll long longusing namespace std;Ll a[50],f[50][50];int g[50][50];int n,m;void dfs(int x,int y){ if(x>y)return; printf("%d ",g[x][y]); dfs(x,g[x][y]-1); dfs(g[x][y]+1,y);}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); f[i][i]=a[i]; g[i][i]=i; } for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++){ f[i][j]=max(a[i]+f[i+1][j],a[j]+f[i][j-1]); for(int k=i+1;k<=j-1;k++) f[i][j]=max(f[i][j],a[k]+f[i][k-1]*f[k+1][j]); if(f[i][j]==a[j]+f[i][j-1])g[i][j]=j; for(int k=j-1;k>=i+1;k--) if(f[i][j]==a[k]+f[i][k-1]*f[k+1][j])g[i][j]=k; if(f[i][j]==a[i]+f[i+1][j])g[i][j]=i; } printf("%lld\n",f[1][n]); dfs(1,n);}
1 0
- 区间dp-洛谷P1040 加分二叉树
- P1040 加分二叉树(区间DP)
- 洛谷P1040 加分二叉树(DP)
- 洛谷 P1040 加分二叉树
- 洛谷 P1040 加分二叉树
- 洛谷 P1040 加分二叉树
- 洛谷 P1040 加分二叉树
- 洛谷 [P1040]加分二叉树
- P1040 加分二叉树(树形dp)
- 洛谷 P1040 [NOIP2003 T3] 加分二叉树
- 洛谷P1040 加分二叉树(NOIP2003)
- 加分二叉树 区间dp
- P1040 加分二叉树 记忆化搜索
- [NOIP2003]区间dp-加分二叉树
- [区间DP]【NOIP2003T3】加分二叉树 题解
- Vijos P1100 加分二叉树(区间DP,树形DP)
- ACM 106. [NOIP2003] 加分二叉树(区间dp)
- 【基础练习】【区间DP】codevs1090 加分二叉树题解
- Android studio 过滤log中指定字符(不显示包含指定字符的log)
- 普通的 Web 应用数据安全
- JAVA 读取文件字符串乱码问题
- 微信公众号如何获得原创保护?
- test
- 区间dp-洛谷P1040 加分二叉树
- 80% 应聘者都不及格的 JS 面试题
- 使用moy快速开发后台管理系统(四)
- 632-二叉树遍历
- 颜色那点事
- Ambari安装,配置和部署Hadoop集群
- Linux基础——grep匹配命令
- QCoreApplication
- extjs显示格式化返回JSON格式的日期