uva10304-最优排序二叉树

题目链接 http://acm.hust.edu.cn/vjudge/problem/19451

解题思路

dp[l][r] 表示以下标为l到r(包括l、r)节点建立最优排序二叉树。

注意dp计算顺序,以对角线为顺序计算。

具体可以参考网上的各种动态规划教程。

代码

#include<stdio.h>
#include<string.h>
#define MAX_LEN 255
#define inf 1<<31-1
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
int dp[MAX_LEN][MAX_LEN];
int value[MAX_LEN];
int sum[MAX_LEN];
int main()
{
    int n;
    while(scanf("%d", &n) == 1) {
        memset(sum, 0, sizeof(sum));
        memset(dp, 0, sizeof(dp));
        for(int i=0; i<n; i++) {
            scanf("%d", &value[i]);
            if(i == 0) sum[i] = value[i];
            else sum[i] = sum[i-1] + value[i];
        }
        for(int d=0; d<n; d++)
            for(int l=0; l<n; l++) {
                int minv = inf;
                int r = (l + d) < n ? (l + d) : (n - 1);
                for(int k=l; k<=r; k++) {
                    int u;
                    int k1 = max(k - 1, l);
                    int k2 = min(k + 1, r);
                    u = dp[l][k1] + dp[k2][r];
                    u += sum[r] - sum[l]  + value[l] - value[k];
                    if(u < minv) minv = u;
                }
                dp[l][r] = minv;
            }
        printf("%d\n", dp[0][n-1]);
    }
    return 0;
}

时间: 2024-12-30 02:58:38

uva10304-最优排序二叉树的相关文章

排序二叉树的基本操作

描述 二叉树的构建.插入新的结点.树的先中后序以及层序四种遍历 代码 import java.util.LinkedList; import java.util.Queue; class Node{ public int data; public Node left; public Node right; public Node(int data){ this.data=data; this.left=null; this.right=null; } } public class BinaryT

二叉树及排序二叉树的相关操作汇总

前记:由于种种原因,以前一看到什么树啊链表啊,那就相当的恐惧,真是惭愧,最近仔细研究了一下这些东西,发现也就那样,或许是我之前根本就没怎么花心思学.. 话不多说,下面就直接上代码吧,也没什么好解释的,只要我自己理解代码就行了,哈哈哈... 代码参考<C和C++程序员面试秘笈>一书 // Tree.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stack> #include <queue>

TreeMap源码分析之一 —— 排序二叉树、平衡二叉树、红黑树

一.排序二叉树(BST树) 1.排序二叉树的定义 排序二叉树,Binary Sort Tree 排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树: (1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值: (2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值: (3)它的左.右子树也分别为排序二叉树. 按中序遍历排序二叉树可以得到由小到大的有序序列. 比如 2.排序二叉树的插入和删除 二.平衡二叉树(Balanced Binary Tree,AVL树) 三.红黑

排序二叉树

题目大意:请完成下面四个函数的定义(在tree.h文件中),使整个程序能够利用排序二叉树的结构对输入的数(不会出现相同的数),进行排序输出.节点的结构体在下面已给出,这个二叉树的特征是,左子数的值肯定比父节点小,右子树的值肯定比父节点的大.要求大家按照这个结构特征去构建二叉树,最后中序遍历输出就是我们要求的升序输出. 树的节点结构体为: typedef struct Node { struct Node *left; struct Node *right; int value; } Node;

纪念逝去的岁月——C/C++排序二叉树

1.代码 2.运行结果 3.分析 1.代码 #include <stdio.h> #include <stdlib.h> typedef struct _Node { int value; struct _Node * pLeft; struct _Node * pRight; } Node; Node * getNewNode(int iValue) { Node * p = (Node *)malloc(sizeof(Node)); if(NULL != p) { p->

一步一图一代码:排序二叉树

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 属性: ①若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. ②若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值. ③它的左.右子树也都是排序二叉树. 添加操作: 当根节点为空时,添加进的节点作为根节点.然后每次添加节点时,都从根节点过滤,以根节点作为当前节点,如果新节点大于当前节点,则走当前节点的右子节点分支,如果新节点小于当前节点,则走当前节点的左子节点分支.然后再用右子节点

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

算法学习之查找(顺序、二分法、排序二叉树以及 Hash 表)

[摘要]查找--用关键字标识一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素.在计算机中进行查找的方法是根据表中的记录的组织结构确定的.查找功能数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. 1. 顺序查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据.此时数据本身没有特征,所以我们需要的那个数据可能出现在数组

(eden)排序二叉树VS二叉树链表

排序二叉树 Description: If you have any doubt on this assignment, please send an email to its author 黎洋. --> 题目大意:请完成下面四个函数的定义(在tree.h文件中),使整个程序能够利用排序二叉树的结构对输入的数(不会出现相同的数),进行排序输出.节点的结构体在下面已给出,这个二叉树的特征是,左子数的值肯定比父节点小,右子树的值肯定比父节点的大.要求大家按照这个结构特征去构建二叉树,最后中序遍历输