自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

L.

天将明

  • 博客(33)
  • 收藏
  • 关注

原创 HDOJ-1421 搬寝室

用dp(i)(j)表示前i个物品中取j对的最小疲劳度,状态转移方程: dp[i][j] = min(dp[i-1][j], dp[i-2][j-1] + (num[i]-num[i-1]) * (num[i]-num[i-1]));#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#includ

2016-02-29 13:41:05 281

原创 HDOJ-1069 Monkey and Banana

这道题的解法类似最长上升子序列,线性上的动态规划.#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;struct Block{ Block(){} Block(int a, int b, int c){

2016-02-28 16:25:40 239

原创 HDOJ-2845 Beans

这道题是线性上的动态规划.dp(i)表示以第i个数据一定要取得情况下,这一行前i数据按题目要求取得的最大数据之和,状态转移方程:dp(i) = max(dp(i-2), dp(i-3)) + dp(i);#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>usin

2016-02-28 12:44:15 205

原创 HDOJ-1059 Dividing

二进制思想求解把每个价值的物品转化为几个独立的物品,在用01背包问题求解.#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;int dp[120005];int num[7], k[20005];int main()

2016-02-28 11:07:18 229

原创 HDOJ-2577 How to type

用dp(i, 0)表示关掉CapsLK情况下输入第i-1个字母最少按键数,dp(i, 1)表示开启CapsLK情况下输入第i-1个字母的最少按键数#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;int dp[110][2

2016-02-28 10:01:32 248

原创 HDOJ-1087 Super Jumping! Jumping! Jumping!

最大上升子序列,做法和最长上升子序列类似#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;int dp[1005], num[1005];int main(){ // freopen("in.txt", "r",

2016-02-22 19:55:30 211

原创 HDOJ-1081 To The Max

这道题是最大连续子序列之和的变形. 要求第i行到第j行的最大矩阵,就把i到j行元素按列相加,就是求最大连续子序列之和了.#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;#define INF 1e8int visi

2016-02-22 19:05:09 206

原创 HDOJ-1978 How many ways

注意:选择一个终点代表了一种路径选择#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;int dp[105][105];int main(){ //freopen("in.txt", "r", stdin);

2016-02-22 15:46:06 234

原创 HDOJ-1114 Piggy-Bank

完全背包问题#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;#define INF 1e9int c[505], v[505], dp[10005];int main(){ //freopen("in.txt

2016-02-22 12:56:58 298

原创 HDOJ-1712 ACboy needs your help

这道题是分组背包问题. 状态转移方程 : dp[v] = max(dp[v], dp[v-h] + A[i][h]); #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector>using namespace std;int A[105][105], dp[105

2016-02-22 12:18:28 196

原创 HDOJ-2159 FATE

这道题是二维费用的完全背包问题.两种费用支付的最大值分别为,忍耐度和最多杀怪数. 状态转移方程为: dp[j][h] = max(dp[j][h], dp[j-pa[i]][h-1] + expe[i]); #include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <vector

2016-02-22 11:34:08 203

原创 HDOJ -1203 I NEED A OFFER!

这道题用dp(i)表示用完i万元得不到一个off的最小概率,状态转移方程: dp[j] = min(dp[j], dp[j-sch[i].a] * sch[i].b);#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<vec

2016-02-20 21:25:06 186

原创 HDOJ-1171 Big Event in HDU

01背包解法求出最接近总价值一半的值即可#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include <iostream>#include <sstream>using namespace std;

2016-02-18 14:39:38 170

原创 HDOJ-2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

这道题和01背包问题唯一的区别是每种物品有多个,只要把s个相同物品当作s种来做就完全和01问题一样了.#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include <iostream>#include

2016-02-18 13:57:32 285

原创 HDOJ-2955 Robberies

这道题是01背包问题的变形。01背包问题中dp(i)中的i表示体积,而这道题中i按理说应该表示概率,又因为概率是浮点数不能表示,所以这里的i表示钱。还有我把被抓概率转化为逃跑成功概率便于计算。 状态转移方程:dp(i) = max(dp(i), dp(i - bank[j].money) * bank(j).pos);#include <iostream>#include <cstdio>#i

2016-02-17 17:41:17 195

原创 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 321

原创 图的色数

图论有个经典问题是这样的:给定一个无向图,把图中的结点染成尽量少的颜色,使得相邻结点颜色不同. 用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 5457

原创 货郎担问题(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 2631

原创 最优配对问题

最优配对问题:空间里有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 2782

原创 HDOJ 5621 KK's Point

题意:在圆上有n个点,两两相连,保证任意三条线不会交于一点,问有多少交点。 思路:先从第二个点出发,算出它连到到第4…n个点之间的交点,再从第三个点出发,以此循环#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;#define maxn 100000in

2016-02-11 08:01:25 258

原创 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 420

原创 树的最大独立集

树的最大独立集合:对于一颗无根树,选出尽量多的点使得任何两个结点均不相邻。 用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 4371 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 229

原创 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 262

原创 无根树转化为有根树

离散数学中,无根树指无环连通无向图。 一棵无根树是一个二元组(v,e),其中:1.V是非空集合,称为顶点集。2.E是V中元素构成的无序二元组的集合,称为边集。 直观来说,若一个图中每条边都是无方向的,则称为无向图。无向图中的边均是顶点的无序对,无序对通常用圆括号表示。无根树它要求每个顶点之间都直接或间接相连,且图中没有环,即只有简单路径。 由于树是图的子集,这一类图具有树的特征,但不具有树状的

2016-02-04 23:16:50 2144

原创 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 232

原创 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 323

原创 最优矩阵链乘

一个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 716

原创 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 354

原创 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 360

原创 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 282

原创 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 226

原创 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 271

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除