1130. 叶值的最小代价生成树

1.dp

 1 int mctFromLeafValues(vector<int>& arr) {
 2     int len = arr.size();
 3     vector<vector<int>> rmq(len, vector<int>(len, 0));
 4     for (int i = 0; i < len; i++)
 5         rmq[i][0] = arr[i];
 6     for (int j = 1;  (1<<j)<len ; j++)
 7     {
 8         for (int i = 0;  i+(1<<j-1)<len ; i++)
 9         {
10             rmq[i][j] = max(rmq[i][j - 1], rmq[i + (1 << j - 1)][j - 1]);
11         }
12     }
13     vector<vector<int>> dp(len, vector<int>(len, INT_MAX));
14     for (int i = 0; i < len; i++)
15         dp[i][i] = 0;
16     for (int i = 1; i < len; i++)
17     {
18         for (int j = 0; j < len - i; j++)
19         {
20             for (int k = j; k < i + j; k++)
21             {
22                 int width1 = log2(k - j + 1);
23                 int width2 = log2(j + i - k);
24                 dp[j][j + i] = min(dp[j][j + i], dp[j][k] + dp[k + 1][j + i] + max(rmq[j][width1],rmq[k-(1<<width1)+1][width1])*max(rmq[k+1][width2],rmq[j+i-(1<<width2)+1][width2]));
25             }
26         }
27     }
28     return dp[0][len - 1];
29 }

原文地址:https://www.cnblogs.com/zouma/p/11684718.html

时间: 2024-08-29 19:08:40

1130. 叶值的最小代价生成树的相关文章

TZOJ 5471: 数据结构实验--图的最小代价生成树

题目描述 求带权无向图的最小代价生成树. 输入 输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附的两个顶点,第3个整数是边的权值. 所有值不超过20. 输出 请使用prim算法生成一棵生成树,并输出为生成树的各条边及其权值.格式见样例. 样例输入 5 71 2 11 3 12 3 42 4 22 5 13 4 54 5 6 样例输出 1 2 11 3 12 5 12 4 2 PS:太惭愧了,写

最小代价生成树(数据结构)

1 //最小代价生成树 2 //prim算法(稠密图):从与这棵树相连的边中选择最短的边,并将这条边及其所连顶点接入当前树中 3 void Prim(MGraph g,int v0,int &sum) { 4 int lowcost[maxsize],visit[maxsize],v;//lowcost存放当前树到其他顶点的最小权值的顶点 5 int min,k; 6 v=v0; 7 for(int i=0; i<g.n; i++) { 8 lowcost[i]=g.edges[v0][i]

实验六 最小代价生成树

实验名称:最小代价生成树 实验章节:算法设计与分析第6章 实验目的: 掌握贪心算法解决问题的思想和一般过程,           学会使用普里姆算法解决实际问题. 提交形式: 所有作业的原程序和可执行程序(即cpp文件和exe文件) 纸质实验报告(格式和内容请参阅末页) 实验内容 完善下列程序,并回答问题. 1 #include<iostream.h> 2 3 #define G_NODE_NUM 6 //结点个数 4 5 #define INFTY 65535 6 7 template<

[数据结构] 最小(代价)生成树

在说明最小生成树之前,先重温一下其他的几个概念. 连通图:任意两个顶点都有路径相通的无向图,称为连通图.(注意不是边,而是路径) 强连通图:任意两个顶点都有路径相通的有向图,称为强连通图. 网:图的边具有一定的意义,每条边都对应着一个数据,称为权,这种图被称为网. 连通网,同理. 最小生成树 生成树:从一个连通图中拆出一棵连通子图,它包含了所有的顶点,但只保留了足以构成一棵树的边(N-1条边,N为顶点个数). 最小生成树:对于连通网而言的,所有边的代价之和最小(权的总和最小)的生成树,就是最小生

最小代价生成树

#include<iostream> using namespace std; const int Max = 100; int p[Max][Max]; const int maxCost = 99; int lowcost[Max]; int nearest[Max]; bool mark[Max]; void Prime(int k,int n) { memset(lowcost, 99, sizeof(lowcost)); memset(nearest, -1, sizeof(near

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

算法笔记_164:算法提高 最小方差生成树(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W.保证图连通.n=m=0标志着测试文件的结束. 输出格式 对于每组数据,输出最小方差,四舍五入到0.01.输出格式按照样例. 样例输入 4 51 2 12 3 23 4 24 1 12 4 34 61 2 12 3 23 4 34 1 12 4 31 3 30 0 样

bzoj2395[Balkan 2011]Timeismoney最小乘积生成树

所谓最小乘积生成树,即对于一个无向连通图的每一条边均有两个权值xi,yi,在图中找一颗生成树,使得Σxi*Σyi取最小值. 直接处理问题较为棘手,但每条边的权值可以描述为一个二元组(xi,yi),这也就不难想到将生成树转化为平面内的点,x代表Σxi,y代表Σyi(注意这里的xi,yi指的是在生成树中的边的权值),那么问题就变成了在平面内找一个点使得x*y最小,那么显然这个点是在下凸壳上的. 因此可以首先找出两个一定在凸包上的点,例如A(minx,y),B(miny,x),在直线AB下方找一个在凸

POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树. 解题思路: 对答案进行二分,当把代进去的答案拿来算最小生成树的时候,一旦总路径长度为0,就是需要的答案. 0-1规划是啥? 概念有带权图G, 对于图中每条