摘要:
许久不动笔写东西了,感觉曾经那些熟悉的基础知识变得模糊起来,从今天起梳理一下一些基本知识,与君共勉,立此为证。二叉查找树:所有节点满足条件,节点的key值大于其所有左子树节点的key值,小于其所有右子树节点的key值。插入:当前节点p->key,与所要插入的key值作比较,p->key 2 #include 3 #include 4 typedef struct node 5 { 6 int key; 7 struct node *left; 8 struct node *right; 9 }treeNode; 10 11 //tree的最小值 ... 阅读全文
摘要:
HDU1074,如果仅仅从动态规划角度来看,它属于比较简单的DP问题,但是需要把问题进行转化。利用二进制构造出不同的状态,0代表课程在状态中,1表示课程不在状态中,初态全为0,终态全为1,终态的最小值即为所求结果。 假设输入n门课程,则共有2^n个状态,对于每个状态V({i})(集合{i}表示状态V所完成的课程)需要测试是否包含所有课程,如果包含的课程(j),则根据V({i}-j)计算V({i}),此过程中使用简单的DP公式。由此可见算法复杂度为O(n*2^n),属于NP问题,题目中说明输入数据n<=15,在这种小数量级的情况下,问题还是可解的。 题目中要求除了要输出扣掉的最小分数,还. 阅读全文
摘要:
HDU 1024题目是一道经典的DP问题,它的基础问题是HDU 1003。问题描述大致为:给定输入n,m和数组,然后把长度为n的数组划分成互不交叉的m个子段,要求输出m个子段和的最大值。 DP问题的关键是分析题目要求,写出递归公式。数组为a[](本文中数组下标从1开始计数),把长度为i的数组划分成j段,各段的和用函数f(i,j)表示,且a[i]包含在j段中的某一段。要求出f(i,j),就是把a[i]加入到划分的段中,分为以下两种情况: 1)a[]中前i-1个元素已经划分成j段,只需把a[i]放入第j段中,此时f(i,j)=f(i-1,j)+a[i]; 2)a[]中前i-1个元素划分为... 阅读全文