
算法竞赛入门经典第一章 动态规划
playwfun
宁静致远
展开
-
UVA - 11578(背包类dp)
首先,要对所有的要求,先按时间排序。然后只需对每一步若当前的要求和下一个时间相同,那么把他们两个同时安排,不同,则只安排当下的这个要求,选择有两种1,2 #include #include #include #include #include #include #include #include #include using namespace std; typedef uns原创 2015-03-25 21:20:06 · 441 阅读 · 0 评论 -
UVA -10688(区间dp)
比较水的思路dp ,直接用d[ i ] [ j ] 代表最优解,那么枚举所有可行点, d[ i ][ j ] = max{ d[ i ][ p-1 ]+d[ p+1 ][ j ] +( k+p)*(j-i+1) }; #include #include #include #include #include #include #include #include #includ原创 2015-03-25 15:04:59 · 404 阅读 · 0 评论 -
UVA - 10981(dp ,map做内存类,仍没算出最大内存)
直接用map暴。 #include #include #include #include #include #include #include #include #include using namespace std; typedef unsigned long long LLU; typedef long long LL; #define rep(i,n) for(int原创 2015-03-25 13:42:32 · 405 阅读 · 0 评论 -
UVA - 1484(树形dp,最大值最小值同时维护)
#include #include #include #include #include #include #include using namespace std; #define rep(i,n) for(int (i)=0;(i)<(n);(i)++) #define rep1(i,n) for(int (i)=1;(i)<=(n);(i)++) const int maxn原创 2015-03-31 15:56:58 · 410 阅读 · 0 评论 -
UVA - 11782(背包式树形dp)
这题目的意思好难读,直接无语,原来最佳切割,要保证所有的叶子都被切掉。 直接背包就行,d[ i ] [ j ] 代表编号为i的节点用最多为j个点对其所在子树形成的最佳割。 #include #include #include #include #include #include #include #include #include using namespace std; t原创 2015-03-25 19:58:22 · 472 阅读 · 0 评论 -
UVA - 1390(概率dp + hash)
一开始直接用set做状态,并且用map做记忆,直接超时。 后来改成用hash值做记忆,每个点的查找时间,基本在30左右。 每个状态的定义为 一个 30的数组,存的是当前联通分量中元素个数为i的个数。 状态转移,只有同时选同一集合内元素会导致无法转移到下一阶段。 先计算平均需多少天转移到的联通分量总数 减1的状态,然后具体计算转移到每个下一个状态需要的时间。 如果 当前选择不同联通分量的概原创 2015-04-02 07:39:10 · 595 阅读 · 0 评论 -
uva - 12093(树形dp)
就该题目而言,对状态的限定是非常重要的,先找到合适的状态涵盖所有的因素才能为状态转移打下铺垫。 首先,来谈制约因素,该题目的状态必须表示父,子,孙三代边的的覆盖状态,这是为什么,当前节点已经决策,往下走对子节点决策,而子节点最多会覆盖父,子,孙,曾孙,四代边,那么转移到子节点,就至少描述下面三代的覆盖情况。 状态为 0 : 父边点没被覆盖 1 : 父边被覆盖 2原创 2015-05-08 19:18:44 · 853 阅读 · 0 评论