算法竞赛入门经典-动态规划初步(9)
天夏123
这个作者很懒,什么都没留下…
展开
-
UVA12186 - Another Crisis
设d[u]表示让u给上级发信最少需要多少个工人。假设u有k个子节点,则至少需要s = ceil(k * t / 100.0)个直接下属发信.所以要把这k个子节点的d值排序,把前s个值加起来就是d[u]的值,最终答案为d[0]#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <m原创 2016-02-06 14:54:39 · 296 阅读 · 0 评论 -
UVA1626 - Brackets sequence
设串s至少需要增加d[s]个括号: 1.若s形如(s’)则d[s] 可转移为d[s’]; 2.若s由至少两个字符组成,则可以把S分为A,B两个部分d[s] = d[A] +d[B]; 边界:S为空时d[s] = 0,S为一个字符时d[s] = 1; 注意:一个串在进行第一个处理后还要进行第二个处理。#include <cstdio>#include <iostream>#include原创 2016-02-04 16:56:00 · 248 阅读 · 0 评论 -
UVA10003 - Cutting Sticks
用dp(i, j)表示木棍在i切割点和j切割点之间的最小费用 状态转移方程:dp(i, j) = min(dp(i, j), dp(i, h) + dp(j, h) + num[j] - num[i];#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;#d原创 2016-02-04 13:51:08 · 338 阅读 · 0 评论 -
最优矩阵链乘
一个n*m的矩阵由n行m列共n*m排列而成。两个矩阵A和B可以相乘当且仅当A的列数等于B的行数。一个n*m的矩阵乘m*p的矩阵,运算量为n*m*p。 矩阵乘法不满足分配律,但满足结合律。因此A*B*C既可以按顺序(A*B)C也可以按A(B*C)来进行。假设A、B、C分别是2*3、3*4、4*5的,则(A*B)C运算量是2*3*4+2*4*5=64,A(B*C)的运算量是3*4*5*2*3*5原创 2016-02-04 08:07:26 · 817 阅读 · 0 评论 -
UVA11400 - Lighting System Design
这道题首先把灯泡按电压进行从小到大排序,序列中的一个灯泡i,若有m个灯泡可转化为i,那么该灯泡必定在i的前面,并且这m个灯泡是连续的紧挨在i前面,所以可以枚举有多少个灯泡可转化为i,求出dp[i]的最小值.dp[i] = min(dp[i], (sum[i] - sum[j]) * lamp[i].c + dp[j] + lamp[i].k); 那么为什么这m个灯泡是连续的?假如有灯泡a, b,原创 2016-02-03 18:44:43 · 385 阅读 · 0 评论 -
UVA12563 - Jin Ge Jin Qu hao
01背包问题 这道题是要求出再t时间内能够唱的最多的歌曲数,在这个前提下,唱的最长时间.因为每首歌长不大于三分钟,所以在给定歌曲数n的情况下,唱的时间最长为3*n+678.因为劲歌金曲一定要唱,所以要求出在t-1秒内唱的最多歌曲数和此前提下的最长时间,转化为了01背包问题.#include <cstdio>#include <iostream>#include <algorithm>#inc原创 2016-02-03 13:32:48 · 375 阅读 · 0 评论 -
UVA1347 - Tour
这道题采取两个人同时从起点开始沿着两个不相交的路线走的方法。 d[i][j](i > j),一个人走到了i点,一个人走到了j点,表示从这个状态出发,两个人都走到终点时,走过的最小距离。 状态转移方程:d[i][j] = min(dp(i+1, j) + f(i, i+1), dp(i+1, i), f(j, i+1)); f(i, i+1)表示i点到i+1点的距离#include <cstdi原创 2016-02-02 16:36:38 · 297 阅读 · 0 评论 -
UVA437 - The Tower of Babylon
有向无环图最长路径算法 每个立方体都可以分别以三个边为高,这样一个立方体确定高后,就有三个状态,存储在cube中。 在用Graph邻接数组存储每个状态之间的关系,这样就形成了有向无环图。在用dp[i] = max(dp[i], solve(j) + cube[i].h)(i -> j),求出每个d[i],取最大值输出.#include <cstdio>#include <iostream>#原创 2016-02-02 13:48:48 · 254 阅读 · 0 评论 -
UVA1025 - A Spy in the Metro
用d[i][j]表示在时刻i,车站j的最少等待时间 有三种决策: 1.等一分钟 2.乘往左开的车 3.乘往右开的车 这三种情况下算处的d[i][j]取最小值#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <vector>using n原创 2016-02-02 12:51:23 · 281 阅读 · 0 评论 -
UVA10817 - Headmaster's Headache
用集合s1表示一个人教的科目的集合,s2表示至少两个人教的科目的集合,s0表示无人教的科目的集合.d(i, s1, s2)表示已经考虑了前i个人时的最小花费. 状态转移方程: d(i, s1, s2) = min(d(i+1, s1, s2), d(i+1, s1’, s2’)), s1’, s2’表示招聘了第i个人后的新值。#include<cstdio>#include<cstdlib>#原创 2016-02-13 08:51:06 · 361 阅读 · 0 评论 -
图的色数
图论有个经典问题是这样的:给定一个无向图,把图中的结点染成尽量少的颜色,使得相邻结点颜色不同. 用d(s)表示把结点集s染色,所需的颜色数的最小值,则 d(s) = d(s-s’) +1;其中s’是s的一个子集,并且内部没有边,即s’中任意两点不想邻.#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>原创 2016-02-12 16:17:04 · 5557 阅读 · 0 评论 -
货郎担问题(TSP)
有n个城市,用0,1,…,n-1表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短? 不妨设0为起点和终点, d(i, s)为从i出发, 还需访问s中的各个城市一次回到0,走过的距离. 状态转移方程:d(i, s) = min{d(j, s - {j}) + dist(i, j)}#include<cstdio>#incl原创 2016-02-12 15:16:50 · 2673 阅读 · 0 评论 -
最优配对问题
最优配对问题:空间里有n个点P0,P1,…,Pn-1,你的任务是把它们配成n/2对(n是偶数),使得每个点恰好在一个点对中。所有点对中两点的距离之和应尽量小。 1.设d(i, s)表示前i个点中,位于集合s中的元素两两配对的最小距离和 则状态转移方程 d(i,S)=min{|PiPj|+d(i-1,S-{i}-{j}#include<cstdio>#include<cstdlib>#incl原创 2016-02-12 10:42:02 · 2839 阅读 · 0 评论 -
UVA1218 - Perfect Service
1.d(0, u)表示u是服务器. 2.d(1, u)表示u的父节点是服务器. 3.d(2, u)表示u和u的父节点都不是服务器 状态转移方程: v是u的子节点 d(0, u) = sum(min(d(0, v), d(1, v))); d(1, u) = sum(d(2, v)); d(2, u) = min(d(2, u), d(1, u) - d(2, v) + d(0,原创 2016-02-07 19:45:45 · 434 阅读 · 0 评论 -
树的最大独立集
树的最大独立集合:对于一颗无根树,选出尽量多的点使得任何两个结点均不相邻。 用d(i)表示以i为根结点的子树的最大独立集大小。 对于结点i,只有两种选择,选或者不选,若选,则问题转化为求出i的孙子的d值之,若不选则转化为求i的儿子的d值之和。 状态转移方程:d(i) = max(1 + gs[i], s[i]);#include <iostream>#include <vector>#in原创 2016-02-06 18:22:33 · 4424 阅读 · 1 评论 -
UVA1220 - Party at Hali-Bula
这道题几乎就是树的最大独立集问题,只不过要判断唯一性。 在这里用了个ju[0], ju[1],ju[2],来判断相应的d, s, gs数组中值得唯一性.#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <vector>#include <cma原创 2016-02-06 18:12:24 · 244 阅读 · 0 评论 -
无根树转化为有根树
离散数学中,无根树指无环连通无向图。 一棵无根树是一个二元组(v,e),其中:1.V是非空集合,称为顶点集。2.E是V中元素构成的无序二元组的集合,称为边集。 直观来说,若一个图中每条边都是无方向的,则称为无向图。无向图中的边均是顶点的无序对,无序对通常用圆括号表示。无根树它要求每个顶点之间都直接或间接相连,且图中没有环,即只有简单路径。 由于树是图的子集,这一类图具有树的特征,但不具有树状的原创 2016-02-04 23:16:50 · 2234 阅读 · 0 评论