找到n个身高不同的路人排成一排,A、B两人从左端开始轮流选取一人或两人出列,最对身高求和。编程求谁赢

确实是DP问题。不过你说的解法应该是有问题的,那样做不能保证全局最优。
我觉得应该这么做:声明一维dp数组,其中dp代表区间范围内(也就是从第i个人到队列末尾)先选取者可以获得的最大身高和与后选取者可以获得的最大身高和的gap,也就是假设从i开始,A先选能得到最大身高和为S,B后选在剩下来的人中能得到最大身高和为T,则dp=S-T,那么状态转移方程为
dp = max(heights-dp, heights+heights-dp)即代表区间内先选取者能得到的最优解gap等于先选取者只选第一个人减去后选取者得到的最大gap与先选取者选两个人减去后选取者得到的最大gap中的较大值。
【找到n个身高不同的路人排成一排,A、B两人从左端开始轮流选取一人或两人出列,最对身高求和。编程求谁赢】 简单的C++实现代码
bool PredictWinner(vector\u0026lt;int\u0026gt;\u0026amp; heights){ int length = heights.size(); vector\u0026lt;int\u0026gt; dp(length, 0); for (int l=1, i=0; l\u0026lt;=length; ++l) { i = length - l; if (l==1) dp = heights; else if (l==2) dp = heights + heights; else dp = max(heights-dp, heights+heights-dp); } return dp\u0026lt;0? false:true;}
■网友
可以用暴力法,把一只队伍针对各种可能性,虚拟成n种,虚拟后只能一人选一个,而不是一至2个。2113426 ok22366 ok21448ok2278 22726 ok22348ok21466 ok21178 ok211366 211726 21448ok31348ok31366ok313426 31466 ok31448 ok3448 34426 ok把以上做成一个二叉树,对奇数层节点来说,就是a的选择。然后从最底下开始计算,对奇数层节点打标记。根节点按0算。比如21448,8是最底层,又是奇数,计算结果ok,就对8打上标记。再往上看第三层4这个节点,计算另外一条路径,21466,如果结果也ok,把4也做上标记。计算完一次,树就矮了2层,递归计算即可。


    推荐阅读