摘要:
通过分类讨论,将规模较大的问题转换成规模较小的相同问题,学会”降维“,将索引值不断降小,就可以递归求解设f(m,n)为把m个苹果放到n个盘子中的方法数,m>=0,n>=0.若m和n中任何一个等于0,那么f(m,n) = 1,注意不是等于0,因为相当于就那么一种结果,就是不往盘子里面放(没有苹果),或者,连盘子都没有。若n=1,显然对于任意的m>=0 有f(m,1) = 1若m=1,显然对于任意的n>=0 有f(1,n) = 1接下来讨论m>1 && n>1的情况:若 m < n 则 f(m,n) = f(m,m)。即空哪几个盘子都是一样 阅读全文
摘要:
这题是求数字三角形由顶到底边最大数字和对应的路径,在准备夏令营的时候红皮教材上面有,当时没有学动态规划算法,不是很理解,经过这一阵对算法的学习和POJ训练,总算在10分钟内独立思考AC,其实挺简单,满足最优子结构和无后效性,是经典的动态规划问题。一般的思考方法是,由特殊情况比如题目给的示例数据入手,分析如何计算辅助数组dp的值,dp[i][j]记录以r[i][j]为顶点向下走到底边可以得到的最大和,dp数组底边的值就是数字三角形底边数字,然后从底向上计算,dp数组的计算方程(即动态规划状态方程)为dp[i][j] = max(r[i][j] + dp[i+1][j] , r[i][j] + d 阅读全文
摘要:
这题主要求二叉树结点到根结点的路径长度,基本的思路是 比较a与b,如果a大则当前结点是左孩子,a-b作为父结点的左数,父结点的右数与当前右数相等;如果b大则当前结点为右孩子,同理可以求父结点,直到父结点为(1,1)遍历结束。当用原始的递归算法会超时,需要考虑a=1或b=1的特殊情况,同时利用a与b的倍数关系加快遍历速度Source CodeProblem: 2499User: yangliuACMerMemory: 244KTime: 0MSLanguage: C++Result: Accepted#include <iostream>
using namespace std; v 阅读全文
摘要:
这题就是求中位数,直接用qsort排序取中,算法复杂度为O(NlogN)当然求中位数的最优算法是O(N)的Select算法Source CodeProblem: 2388User: yangliuACMerMemory: 284KTime: 63MSLanguage: C++Result: Accepted#include <iostream>
#include <stdlib.h>
using namespace std; int comp(const void * a, const void * b){ return (*(int*)a - *(int*)b);
} 阅读全文