noi 2009 二叉查找树 动态规划

 

思路:

先把权值离散化

按数据值排序

sum[i]为前i个节点频度和

dp[i][j][w]表示把节点[i,j]合并成一颗根节点权值不小于w的子树所需的访问代价与修改代价的最小和

dp[i][j][w]=min(dp[i][k-1][w]+dp[k+1][j][w]+sum[j]-sum[i-1]+K,dp[i][k-1][a[k].weight]+dp[k+1][j][a[k].weight]+sum[j]-sum[i-1](a[k].weight>=w))

(i<=k<=j)

ans=dp[1][n][1];

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<map>
 6 #include<algorithm>
 7 using namespace std;
 8 #define MAXN 80
 9 #define INF 987654321
10 int n,m;
11 struct node
12 {
13     int key,weight,frequence;
14 }a[MAXN];
15 int sum[MAXN];
16 int dp[MAXN][MAXN][MAXN];
17 bool cmp1(const node &A,const node &B)
18 {
19     return A.weight<B.weight;
20 }
21 bool cmp2(const node &A,const node &B)
22 {
23     return A.key<B.key;
24 }
25 int main()
26 {
27     memset(dp,0,sizeof(dp));
28     scanf("%d%d",&n,&m);
29     int i,j,k,w,t;
30     for(i=1;i<=n;i++)
31         scanf("%d",&a[i].key);
32     for(i=1;i<=n;i++)
33         scanf("%d",&a[i].weight);
34     for(i=1;i<=n;i++)
35         scanf("%d",&a[i].frequence);
36     sort(a+1,a+n+1,cmp1);
37     for(i=1;i<=n;i++)
38         a[i].weight=i;
39     sort(a+1,a+n+1,cmp2);
40     sum[0]=0;
41     for(i=1;i<=n;i++)
42         sum[i]=sum[i-1]+a[i].frequence;
43     for(i=1;i<=n;i++)
44         for(j=1;j<=n;j++)
45         {
46             if(a[i].weight>=j)
47                 dp[i][i][j]=a[i].frequence;
48             else
49                 dp[i][i][j]=a[i].frequence+m;
50         }
51     for(w=n;w>=1;w--)
52     for(t=1;t<n;t++)
53     for(i=1;i+t<=n;i++)
54     {
55         j=i+t;
56         int s=INF;
57         for(k=i;k<=j;k++)
58         {
59                 s=min(s,dp[i][k-1][w]+dp[k+1][j][w]+sum[j]-sum[i-1]+m);
60                 if(a[k].weight>=w)
61                     s=min(s,dp[i][k-1][a[k].weight]+dp[k+1][j][a[k].weight]+sum[j]-sum[i-1]);
62         }
63         dp[i][j][w]=s;
64     }
65     int s=INF;
66     printf("%d\n",dp[1][n][1]);
67     return 0;
68 }

转载于:https://www.cnblogs.com/myoi/archive/2012/07/16/2592942.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

不管你挣多少钱永远都是问题

近几个月太多事情&#xff0c;太多变化&#xff0c;一直没有心情写博客&#xff0c;今天补上一篇吧&#xff01; 我会一直在这里坚持下去的&#xff01;他年收入100多万开着一辆宝马5&#xff0c;天天被应酬折腾的要死要活&#xff0c;真想狠狠心不干了&#xff0c;当初干嘛非要…

栈清空程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

hdu 1325 Is It A Tree?

题目链接 #include"stdio.h" int set[1001],v[1001],cnt[10001],flag; //初始化 void fun() {int i;flag1;for(i1;i<1000;i){set[i]i;v[i]0;cnt[i]0;} } //查找根节点 int find(int x) {return xset[x]?x:find(set[x]); } int judge() {int i,t;for(i1;i<1000…

数据库的介绍

##本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ …

InfoPath Resource Sites

http://blogs.msdn.com/infopath_support/archive/2009/11/09/9919841.aspx转载于:https://www.cnblogs.com/mingle/archive/2012/07/24/2606277.html

MySQL的常见命令

###MySQL的常见命令 1.查看当前所有的数据库 show databases; 2.打开指定的库 use 库名 3.查看当前库的所有表 show tables; 4.查看其它库的所有表 show tables from 库名; 5.创建表 create table 表名( 列名 列类型, 列名 列类型…

算法导论 CLRS 22.4-4 解答

先说结论&#xff1a; 对于有环图&#xff0c;top排序不一定可以生成坏边最小的序列 证明&#xff1a; 1. 假设G至少需要去掉k条边才能变成无环图&#xff0c;则任意序列P的坏边数目bad[P] > k&#xff1b; 证明&#xff1a; 如果存在P使得bad[P] < k, 则只要去掉P中的坏…

MySQL DQL语言的笔记

##DQL语言的学习 ###进阶1&#xff1a;基础查询 语法&#xff1a; SELECT 要查询的东西 【FROM 表名】; 类似于Java中 :System.out.println(要打印的东西); 特点&#xff1a; ①通过select查询完的结果 &#xff0c;是一个虚拟的表格&#xff0c;不是真实存…

MySQL学习笔记——显示数据库信息

show privileges 显示可用的系统权限清单。   View Code mysql> show privileges;-----------------------------------------------------------------------------------------------------------------------| Privilege | Context …

MySQL DML语言笔记

##DML语言 ###插入 语法&#xff1a; insert into 表名(字段名&#xff0c;...) values(值1&#xff0c;...); 特点&#xff1a; 1、字段类型和值类型一致或兼容&#xff0c;而且一一对应 2、可以为空的字段&#xff0c;可以不用插入值&#xff0c;或用null填充…

2012年7月份第4周51Aspx源码发布详情

变幻球游戏源码 2012-7-27[VS2010] 游戏规则&#xff1a;球变色顺序: 绿->黄->橙->红->爆炸&#xff0c;在GO完后就可以开始不停拨球&#xff0c;任何颜色都可以拨球&#xff0c;让其重新计时&#xff0c;否则等它们同时变出一大片黄色&#xff0c;会应接不暇&…

MySQL DDL语言笔记

##DDL语句 ###库和表的管理 库的管理&#xff1a; 一、创建库 create database 库名 二、删除库 drop database 库名 表的管理&#xff1a; #1.创建表 CREATE TABLE IF NOT EXISTS stuinfo( stuId INT, stuName VARCHAR(20), …

生成指定大小的空文件

dd if/dev/zero ofM.file bs1M count50 生文件名为 M.file的空文件&#xff0c;写 50 次&#xff0c;每次写1M&#xff1b;转载于:https://www.cnblogs.com/bluebbc/archive/2012/08/03/2621284.html

MySQL事务介绍

##数据库事务 ###含义 通过一组逻辑操作单元&#xff08;一组DML——sql语句&#xff09;&#xff0c;将数据从一种状态切换到另外一种状态 ###特点 &#xff08;ACID&#xff09; 原子性&#xff1a;要么都执行&#xff0c;要么都回滚 一致性&#xff1a;保证…

【原】unity3D ios 退出保存数据(2)

前一篇退出保存数据仅试用于ipad1 ipad2 、phone4s及以前版本&#xff0c;不适用于new pad(不支持后台渲染) 所以修改了前文&#xff0c;以此适应现有的所有ios设备. 实现如下&#xff1a; void OnApplicationPause(bool pause) { if(pause)//暂停游戏 { …

队列入门简介

线性结构的两种常见应用之二队列 定义:种可以实现“先进先出”的存储结构 分类:链式队列(链表实现)、静态队列(数组实现) 队列&#xff08;常用数据结构之一&#xff09; 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行…

java利用htmlparser得到网页html内容

java利用htmlparser得到网页html内容&#xff0c;利用org.htmlparser.Parser包我们可以很轻松取到任何页面的源代码&#xff0c;方法如下&#xff1a; /*** 返回网页内容* * param path* return*/public static String getItemDesc() {String htmlStr "";try {URL u…

ucOS看门狗

在实时多任务系统中&#xff0c;定时器的喂狗不能在像硬件编程那样在循环中喂狗。 ucos系统中&#xff0c;多个任务就像把程序划分成了多个main&#xff08;&#xff09;。喂狗也不像无系统程序那么简单。在参考了网上高手的帖子后&#xff0c;总结了以下几种方式: 方法1:在最低…

静态队列

静态队列- --用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列&#xff1f; 数组表示的问题  对于队列最好的方法是使用链表实现&#xff0c;因为对于数组来说&#xff0c;队列可能会出现下面这种情况&#xff1a; 如图所示&#…