百度最新面试题

hackbuteer1 2011-10-21 09:58:55
1、8*8的棋盘上面放着64个不同价值的礼物,每个小的棋盘上面放置一个礼物,一个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角,有一个上限K,请设计一个算法使其能够获得最大价值和的礼物,但是最大价值为不超过上限K。

2、已知有m个顶点,相邻的两个顶点之间有一条边相连接,首位顶点也有一条边连接,这样就构成了一个圆环。
现在有一个二维数组M[][],M[i][j]=1时,表明第i和j个节点之间有条边存在,M[i][j]=0时,表明第i和j个节点之间没有边存在,其中 M[i][i]=0,M[i][j]=M[j][i],输入为一个二维数组M[][]和顶点的个数n,试着判断该图中是否存在两个圆环,且两个圆环彼此之间没有公共点。
bool IsTwoCircle(int **M,int n)
{
......
}
...全文
262 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]
有了,办法比较笨,这个问题就是无向图找回路问题.

可以对每个顶点做深搜,进入一个顶点给它标记灰色,离开一个顶点标记回白色,如果某个顶点的邻接顶点是灰色,那么就是一个环,为了表示这个环,我们在深搜过程中还需要维护一个pre域即可.

这个DFS找环倒没什么可说的,反向边问题.

至于找出所有的环之后,PS:一个环可能从不同的方向被获得,所以结果中可能1种环对应2个结果.

之后就是……
[/Quote]

额,有问题,其实一种环可能对应N种结果.... 这个怎么过滤呢... 办法就是对于找出的所有环,

对于每个环,找到环中编号最小的结点,之后做循环位移让最小的结点排列在第一位.

这样统一之后再去重就很简单了.
qq120848369 2011-10-21
  • 打赏
  • 举报
回复
有了,办法比较笨,这个问题就是无向图找回路问题.

可以对每个顶点做深搜,进入一个顶点给它标记灰色,离开一个顶点标记回白色,如果某个顶点的邻接顶点是灰色,那么就是一个环,为了表示这个环,我们在深搜过程中还需要维护一个pre域即可.

这个DFS找环倒没什么可说的,反向边问题.

至于找出所有的环之后,PS:一个环可能从不同的方向被获得,所以结果中可能1种环对应2个结果.

之后就是过滤掉我上边说的1环对2结果,这个很简单,把两个序列中某一个逆序之后比较相等就说明是同一个环.

再之后如何判断不想交的环,可以用并查集,首先每个环内部所有点并在一起,之后只要判断每两对环是否属于同一个集合即可.
qq120848369 2011-10-21
  • 打赏
  • 举报
回复
1,哥已经写过,3层循环的DP,int dp[i][j][limit],表示i,j开始不超过limit的最大和,从右下角开始往上推:
dp[i][j][limit]=max{dp[i+1][j][limit-value[i][j]],dp[i][j+1][limit-value[i][j]]}+value[i][j];

初始化dp[][][]为0,0的意思是不可能达到右下角的意思,DP最外循环是i=(row...0),中循环是j=(col...0),内循环是limit=(0...K).

最后结果是dp[0][0][k],如果为0表示无法到达右下角,如果非0则为不超过K的最大价值.

2,先思考思考。
hackbuteer1 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mougaidong 的回复:]
问了N遍了,还最新
[/Quote]有人问过吗?
turing-complete 2011-10-21
  • 打赏
  • 举报
回复
问了N遍了,还最新

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧