上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 34 下一页
摘要: 题意:给你一个图,图上每个点的信息表示该点的水流方向,若下一步走的方向与水流方向一致,则消耗能量为零,否则消耗能量为1,这样,给定起点和终点,问最少消耗的能量。分析:比赛的时候,一开始交了一个思路很简单的代码,就是用优先队列实现,主要就是标记点的问题了,因为即使使用优先队列,如果当初将一个状态标记为0和1,那么有可能在后面存在“已访问的状态消耗的能量大于即将到达那个状态所消耗的能量”,这样,就无法保证消耗的能量最少了。所以,初始的时候,将每一个状态消耗的能量初始为无穷大,之后,当遇到到达该状态消耗更少能量的,则压入队列。这样就保证了消耗能量最少的问题了。但是,但我把这份很容易敲完的代码叫上去之 阅读全文
posted @ 2011-12-05 17:32 枕边梦 阅读(932) 评论(0) 推荐(0) 编辑
摘要: 额,题意:给定一个4*4的黑白棋盘的初始状态,判断能否通过满足一些给定的翻转规则,使得所有棋面的颜色都一样,如果可以,输出最小步数;分析:我一点优化都没有,直接BFS暴搜,中间有一个state整型变量保存整个图的当前信息,因为总共就16个位,所以刚刚,取出一个状态的 时候,再将state转换为图,可能直接在每一个状态里面保存图回更快些吧,内存应该也不太#include<iostream>#include<algorithm>#include<queue>using namespace std;struct node{ int cnt; int state; 阅读全文
posted @ 2011-12-02 14:09 枕边梦 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 题意:Problem DescriptionACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?分析:与前面的倆道树形dp相比,本题目多了一个限制条件,就是选M个节点,这个很自然的联想到了背包问题,那么要如何在树上做一个01背包呢?先不考虑森林的情况,对于当前这一棵树,就是由以当前节点为根的树出现过的状态跟一棵子树上出现过的状态进行组合for(int j=t;j& 阅读全文
posted @ 2011-12-02 08:32 枕边梦 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 题意:在一棵树上选出一些点,每个点都有一个权值,使得和最大,前提是,父节点和子节点只能选一个。分析:整个代码与1054基本一样的,就是状态转移方程变了 ,因为题目加了一些限制dp[i][0]表示以i为根节点的不选i树的最大权值和dp[i][1]表示以i为根节点的选i的树的最大权值和状态转移方程:dp[i][0]+=max(dp[son[i][j]][0],dp[son[i][j]][1]),(0<j<size[i])dp[i][1]+=dp[son[i][j]][0];(0<j<size[i]) size[i]表示i节点的儿子数#include<iostream>#include& 阅读全文
posted @ 2011-11-30 19:18 枕边梦 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,我的第一道树形DP题意:用最少的点覆盖整棵树,看一下Sample Input 就知道题意。分析:在树上做一个动态规划【状态】:dp[i][0] 为以 i 为根节点,并且该节点不放,所需要的最少的点数dp[i][1] 为以 i 为根节点,并且该节点放,所需要的最少的点数【转移方程】:dp[i][0]=sum(dp[son[i][j]][1]) 该点不放的话,那么它的儿子节点必须都放,这样之间的边才可以被覆盖dp[i][1]=sum(min(dp[son[i][j]][0],dp[son[i][j]][1])) 该点放的话,那么它的儿子节点就有两种决策,一种是放,一种是不放,取 min 就行 阅读全文
posted @ 2011-11-30 18:21 枕边梦 阅读(996) 评论(0) 推荐(0) 编辑
摘要: 与一般的背包问题不同,要求的是第K优解,首先,我们要搞清楚的一个问题就是最优解是怎么求出来的。对于求最优解的情况,我们对每一种状态只保存了该状态下的最优解,忽略了其他解,进而实现状态之间的转移,而对于求第K优解的情况呢?其实只需要保存每一种状态下的前K优解,从这K个状态进行状态间的转移,同时去重,保存当前状态的K优解即可。#include<iostream>#include<algorithm>#include<set>using namespace std;int v[101],w[101];int n,m,k,dp[1010][31];int tmp[6 阅读全文
posted @ 2011-11-30 14:52 枕边梦 阅读(506) 评论(0) 推荐(0) 编辑
摘要: 看完背包九讲的多重背包之后,这题目应该可以轻松做出来了模型:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。方法:基本算法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}复杂度是O( 阅读全文
posted @ 2011-11-30 14:42 枕边梦 阅读(2264) 评论(0) 推荐(0) 编辑
摘要: 题意:大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。分析:直接搜索+模拟对于N和M俩个杯子的当前状态,每次都有俩 阅读全文
posted @ 2011-11-26 14:51 枕边梦 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 题意:已知起点和终点,找出最挖洞最少的路径普通的BFS()就可以了,我想说,天呐,我忘记清空队列 ,模拟赛时候狂WA了#include<iostream>#include<algorithm>#include<queue>using namespace std;int vis[1001][1001],n,m,si,sj,ei,ej,ans;char g[1001][1001];int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};struct state{ int x,y,cnt; state(int _x=0,int _y=0 阅读全文
posted @ 2011-11-26 13:25 枕边梦 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 我实在是无语了,为什么一定要用scanf("%s",map[i])或者 gets(map[i]),我用scanf("%c",map[i][j]) 就wa了n次还是错改了之后,一次就A了题目的意思比较好理解,就是Z占据了主导权,S一直跟着Z做反方向的运动,若S遇到墙,则原定不动。这题目是一个比较基础的BFS吧,只需要用一个四维的数组标记俩个人的状态#include<iostream>#include<algorithm>#include<queue>#include<math.h>using namespac 阅读全文
posted @ 2011-11-26 12:53 枕边梦 阅读(174) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 34 下一页