摘要:
题目链接 http://cs.nyu.edu/courses/spring12/CSCI-GA.2560-001/prog1.html题目大意:给定n个任务的时间、价值及先后序关系,求一个可行的任务子集,使得时间之和不大于deadline,价值之和不小于targetVaule,且不可出现逆序。算法思路:题目已经给出算法,转化为状态空间搜索问题(tree-structured state space search problem),先对结点拓扑排序,存储前序的结点关系,然后先对状态搜索树进行BFS,可行的状态压入队列,到达到限制值后,再以队列中的状态为起点进行迭代深入搜索(Iterative d 阅读全文
摘要:
通过分类讨论,将规模较大的问题转换成规模较小的相同问题,学会”降维“,将索引值不断降小,就可以递归求解设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);
} 阅读全文
摘要:
这个题目直接用的暴力枚举,但是还是WA了几次原因是这句话You should process all pairs of integers and for each pair determine the maximum cycle length over all integers between and including i and j.注意i可能大于j,此时需要交换顺序,但是输出的时候还会是原始顺序比如 输入1 10 输出 1 10 20 ;输入10 1 输出 10 1 20因此交换i和j需要用标志位记录一下Source CodeProblem: 1207User: yangliuACMer 阅读全文
摘要:
水题一道,以后还是不做水题,没什么收获Source CodeProblem: 2017User: yangliuACMerMemory: 244KTime: 0MSLanguage: C++Result: Accepted#include <iostream>using namespace std;int main(){ int n,s[11],t[11]; int i,ret; while(cin>>n, n != -1){ ret = 0; memset(s, 0, sizeof(s)); memset(t, 0, sizeof(t)); for(i = 1; i 阅读全文
摘要:
此题关键要理解输出的定义For each test case, you should output a line contains an integer, which is the length of the longest road to be built such that all the villages are connected, and this value is minimum.输出是最小生成树中最长边的长度对prim算法稍作变化即可ACSource CodeProblem: 2485User: yangliuACMerMemory: 1232KTime: 750MSLangua 阅读全文
摘要:
题目:有两个长为n的非递减数组A和B,把B接在A的后面变成长为2n的数组C。设计算法求C的中位数(第n小数)。思路:O(n)的算法很容易找到,关键是用二分的思想设计logn算法。这题关键是用好a和b数组中脚标和为定值的元素的大小关系。 直观想法是:如果中位数在数组a中,那么若a[m]<b[n-m-2],此时比a[m]小的数最多只有n-2个,即a[m]不可能为第n小数,偏小更新左界;若a[m]> b [n-m-1],此时比a[m]小的数至少有n个,a[m]不可能为第n小数,偏大更新右界;若a[m]介于b[n-m-2]与b [n-m-1]则a[m]恰好为第n小数。中位数在数组b中的情况 阅读全文
摘要:
思路:以物品为结点,物品之间的优惠价格为边权值建图,酋长10000金币当做0号结点,题意就是求图中各结点到0号结点的最短路长度,再加上终点处物品的价值,恰好就是探险家经过这个物品买卖途径所需要付出的金钱。用dijkstra算法求出单源最短路径,从各个结点的最短路径中选出最短的那条就是答案。基本还是经典最短路问题,但做了一点小小变形主要是:1 有结点等级限制,需要枚举等级2 把终点的物品价值计入最短路径中去,并且找最小的最短路径输出3 要注意是单向图,即物品替换关系是单向的Source CodeProblem: 1062User: yangliuACMerMemory: 300KTime: 32 阅读全文