题目
A,B两名参赛者,游戏规则如下:
有m个不同身高的同事站成一排,A ,B 两个参赛者依次从最左边开始选择一名或两名同事出列(A先开始),直到所有同事都被选择完为止,最终计算两名参赛者所选择的同事的身高总和,总身高更高的人获胜。假设两名参赛者足够聪明,请判断第一名参赛者A是输还是赢
输入:
输入第一行为一个正整数,代表同事的数量m
输入的第二行为m个正整数,代表每位同事的身高
输出:
如果参赛者A赢,则输出true,如果输或者打平则输出false
题意
这道题和之前分金子的题一样,同样可以分为相同的子问题,下面给出一种复杂的方法:
假设身高数组为[h1,h2,h3,h4,h5,….hm],A此时的身高总和为sumA,B此时的身高总和为sumB,设定flag为true时,为A先选,flag为false时,为B先选;即flag=true
如上初始条件为:[h1,h2,h3,h4,h5,….hm],sumA=0, sumB=0, flag=true
设递归函数为txsf(),初始条件即为函数参数
此时A先选,可以选一个或者两个,即
txsf([h2,h3,h4,h5,….hm],sumA+h1, sumB, flag=false)或者
txsf([h3,h4,h5,….hm],sumA+h1+h2, sumB, flag=false)
我们只需要判断txsf的返回值,哪个大A就选那个大的
上面的递归函数相当于一个子问题,只是参数变了,那么我们在递归函数中设定出口,即可得出递归函数的值,进而判断如何选取
java实现
这里给出上面复杂思路的算法
改天补上正序方式分解算法