dp[l][r]记录中序序列为l, l+1..r的最大加分值

root[l][r]记录这个序列的根节点

转移

i 为根节点

dp[l][r] = max(dp[l][i-1]*dp[l+1][r]+a[i], dp[l][r])

顺势更新root[l][r]

  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define po pop_back
  4. #define fi first
  5. #define se second
  6.  
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10. typedef pair<int, int> P;
  11.  
  12. const int MAXN = ;
  13. const int MAXE = 1e5+;
  14. const int MAXV = 1e5+;
  15. const int INF = 0x3f3f3f3f;
  16.  
  17. int a[MAXN];
  18.  
  19. int dp[MAXN][MAXN];
  20. int root[MAXN][MAXN];
  21. int n;
  22.  
  23. int dfs(int l, int r)
  24. {
  25. if (l > r) return ; //leave
  26. if (dp[l][r] > ) return dp[l][r];
  27. if (l == r)
  28. {
  29. root[l][r] = l;
  30. dp[l][r] = a[l];
  31. return dp[l][r];
  32. }
  33. for (int i = l; i <= r; i++)
  34. {
  35. int res = dfs(l, i-)*dfs(i+, r)+a[i];
  36. if (res > dp[l][r])
  37. {
  38. dp[l][r] = res;
  39. root[l][r] = i;
  40. }
  41. }
  42. return dp[l][r];
  43. }
  44. void print(int l, int r)
  45. {
  46. if (l > r) return ;
  47. if (l == r)
  48. {
  49. printf("%d ", root[l][l]);
  50. return ;
  51. }
  52. printf("%d ", root[l][r]);
  53. print(l, root[l][r]-);
  54. print(root[l][r]+, r);
  55. }
  56. int main()
  57. {
  58. //freopen("in.txt", "r", stdin);
  59. while (cin >> n)
  60. {
  61. for (int i = ; i <= n; i++) cin >> a[i];
  62. memset(dp, , sizeof(dp));
  63. cout << dfs(, n) << endl;
  64. print(, n);
  65. cout << endl;
  66. }
  67. return ;
  68.  
  69. }

luoguP1040 区间DP(记忆化 加分二叉树的更多相关文章

  1. (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)

    http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats ...

  2. 【基础练习】【区间DP】codevs1090 加分二叉树题解

    2003 NOIP TG 题目描写叙述 Description 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),当中数字1,2,3,-,n为节点编号.每一个节点都有一个分数(均为正整 ...

  3. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

  4. uva 10891 区间dp+记忆化搜索

    https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...

  5. loj 1031(区间dp+记忆化搜索)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...

  6. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  7. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  8. hdu 4597 Play Game(区间dp,记忆化搜索)

    Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...

  9. poj 1088 滑雪(区间dp+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...

随机推荐

  1. java中Integer和int的区别

    亲看这里 例子: public class Test { public static void main(String[] args) { Integer i = new Integer(128); ...

  2. axios的post请求方法---以Vue示例

    Axios向后端提交数据的参数格式是json,而并非用的是form传参,post表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使 ...

  3. java基础——反射机制

    反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  4. 删除sqlserver管理器登录信息缓存

    在Windows10下测试有效: C:\Users\<user>\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shel ...

  5. Git下的gitignore规则介绍

    匹配模式前/代表项目根目录 匹配模式最后加/代表是目录 匹配模式前加!代表取反 (忽略文件夹,但不忽略文件夹下的某个文件) *代表任意个字符 ? 匹配任意一个字符 **匹配多级目录 node_modu ...

  6. LeetCode之Weekly Contest 91

    第一题:柠檬水找零 问题: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向你付 5 美元.10  ...

  7. 【php】命名空间的影响

    命名空间对代码的影响 类(包含抽象类和traits) 接口 常量 函数 ​

  8. python基本操作(四)

    与用户交互 为什么交互? 计算机取代人类,解放劳动力 如何交互 print('-'*100) input('请输入你的姓名:') print(""100) Python2和Pyth ...

  9. Python模块(三)(正则,re,模块与包)

    1. 正则表达式 匹配字符串 元字符 .   除了换行 \w  数字, 字母, 下划线 \d  数字 \s  空白符 \n 换行符 \t  制表符 \b  单词的边界 \W  \D \S 非xxx [ ...

  10. FSMC原理通俗解释

    所以不用GPIO口直接驱动液晶,是因为这种方法速度太慢,而FSMC是用来外接各种存储芯片的,所以其数据通信速度是比普通GPIO口要快得多的.TFT-LCD 驱动芯片的读写时序和SRAM的差不多,所以就 ...