随笔分类 -  ACM-搜索回溯与剪枝

摘要:题目链接 http://cs.nyu.edu/courses/spring12/CSCI-GA.2560-001/prog1.html题目大意:给定n个任务的时间、价值及先后序关系,求一个可行的任务子集,使得时间之和不大于deadline,价值之和不小于targetVaule,且不可出现逆序。算法思路:题目已经给出算法,转化为状态空间搜索问题(tree-structured state space search problem),先对结点拓扑排序,存储前序的结点关系,然后先对状态搜索树进行BFS,可行的状态压入队列,到达到限制值后,再以队列中的状态为起点进行迭代深入搜索(Iterative d 阅读全文
posted @ 2012-02-16 01:28 yangleo 阅读(485) 评论(0) 推荐(0)
摘要:这题主要求二叉树结点到根结点的路径长度,基本的思路是 比较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 阅读全文
posted @ 2012-02-11 15:31 yangleo 阅读(551) 评论(1) 推荐(0)
摘要:很经典的BFS搜索 走迷宫选取经过门最少的路线,这题POJ测试数据设计不全面,changeDir数组赋值错误也可以过。。。主要图的数据结构存储方式和算法实现参考了http://blog.csdn.net/bobten2008/article/details/5093307(1)首先是建图, 由于输入给的都是线段, 但是我们平常处理这类问题都是转换为网格来做的, 因此需要将线段转换为网格.转化的方法是对于每个格子,用其左上角点的坐标来表示这个格子。如果其左上角点的坐标是[i][j],那么这个格子就表示为[i][j].将其四周边界的四条线段归这个格子管.即为每个格子建一个数组round[i][j] 阅读全文
posted @ 2011-12-25 01:51 yangleo 阅读(303) 评论(0) 推荐(0)
摘要:这题和编程之美上面的“地板覆盖”问题有点像,不同的是,编程之美上面只需要判定能否覆盖,这题需要求出总方案数目结题报告转自http://duanple.blog.163.com/blog/static/709717672008930104124684/题意:给你一个h*w的矩形,用一个1*2的小矩形去填充,问有多少种填充方法,不考虑对称性。关键点提示:1.DFS部分实际上是在枚举第i行的放置方法,由此便可以确定出该行及上一行的状态。对于第i行,状态(参数next_stat)的定义是指,前i-1行完全放满,第i行的所有位置是否放置(0,1表示)组成的二进制序列,转化为十进制数后所代表的状态。放置方 阅读全文
posted @ 2011-12-24 16:57 yangleo 阅读(429) 评论(0) 推荐(0)
摘要:这是一道比较简单的DP,通过分析可以设最后拿走的牌为i,则所求的最优解就是i左边和右边子列的最小连乘积再加上x[a]*x[i]*x[b],因为i将原来的序列划分为两个子列,这两个子列符合“最优子结构”和“重叠子问题”的dp特点,他们的最优解互相之间没有影响,只会影响全局问题的最优解,在POJ discuss中的解析比较经典,摘录如下,以后做题可以常常看看discuss,就当学习,但是还是要独立思考为主对于整个牌的序列,最左端和最右端的牌是不能被取走的,除这两张以外的所有牌> ,必然有一张最后取走。取走这最后一张牌有一个仅与它本身以及最左端和最右端的> 牌的值有关的得分,这个分值与其 阅读全文
posted @ 2010-12-14 23:35 yangleo 阅读(235) 评论(0) 推荐(0)
摘要:///这题不是很理解有待于重做,BFS+模拟,模拟有点麻烦 #include<stdio.h> #include<string.h> #include<queue> using namespace std; queue<int> q; int w,h; char map[45][45]; int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; int vis[45][45]; int dire,k;///指向当前移动方向。 int left(int a,int b,int c,int d) { if(a==c& 阅读全文
posted @ 2010-12-11 21:44 yangleo 阅读(165) 评论(0) 推荐(0)