百度最新面试题
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)
{
......
}
[解决办法]
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,先思考思考。
[解决办法]
有了,办法比较笨,这个问题就是无向图找回路问题.
可以对每个顶点做深搜,进入一个顶点给它标记灰色,离开一个顶点标记回白色,如果某个顶点的邻接顶点是灰色,那么就是一个环,为了表示这个环,我们在深搜过程中还需要维护一个pre域即可.
这个DFS找环倒没什么可说的,反向边问题.
至于找出所有的环之后,PS:一个环可能从不同的方向被获得,所以结果中可能1种环对应2个结果.
之后就是过滤掉我上边说的1环对2结果,这个很简单,把两个序列中某一个逆序之后比较相等就说明是同一个环.
再之后如何判断不想交的环,可以用并查集,首先每个环内部所有点并在一起,之后只要判断每两对环是否属于同一个集合即可.