摘要:
http://wikioi.com/problem/1014/01背包问题是最经典的动态规划之一,这道题目甚至是这其中还简单的一种,因为价值就是本身的重量了。本来比如,w是总重量限制,v[]是每个的价值。但一开始我都有点忘了,查找了一下又勾起了回忆。1.它把总重量从1到w作为状态,对初学者并不是很直观的。但DP本来就是空间换时间的算法,里面经常以整数做状态,数目还既不是太大又不是太小。最终经常是n^2或n^3的复杂度。2.01背包问题是个二维数组的DP,状态转移方程式f[i,v]=max(f[i-1,m],f[i-1,m-w[i]]+v[i])。其中f[i,m]表示前i个元素在m是重量限制时的 阅读全文
posted @ 2013-08-22 23:25
阿牧遥
阅读(1960)
评论(0)
推荐(0)
摘要:
http://wikioi.com/problem/1214/这道题也归为贪心了。我也不是很能分辨,但想法确实是:1.有阶段最优化性;2.前一状态和后一状态有关系。想法:1.排个序是很自然的想法,假设按照左端点排序吧;2.然后从左往右取,那么会遇到i+1的左端和当前最右端是否冲突的问题;3.如果不冲突,就把i+1放进来;如果冲突,那么取i+1还是之前的那个呢,就看拿个的右端更小;4.因为反正两个里面取一个,不会改变左边的最多能取的线段树,而右端更小使右边能取的线段树可能更多;5.所以每次比较处理后,比如i处理完了,那么就计算完到i为止能取的最多线段数目,也记录了当前组合最右的断点;6.排序为了 阅读全文
posted @ 2013-08-22 20:12
阿牧遥
阅读(381)
评论(0)
推荐(0)
摘要:
简单的DFS,用数组w记录每一层的宽度就行了,就是遇到一层就++。中间发现在C++里面,如果int未初始化就是用也是有异常的。还有二叉树的数组表示时,从1开始计数会比较好。还有后来学会了数组这样的初始化为0的方法:int l[100] = {0},r[100] = {0};#include using namespace std;int l[20];int r[20];int w[20];int dfs(int level, int node){ w[level]++; if (l[node] == 0 && r[node] == 0) return 1; int dl = 0 阅读全文
posted @ 2013-08-22 00:17
阿牧遥
阅读(423)
评论(0)
推荐(0)

浙公网安备 33010602011771号