纸牌博弈问题

package July;

/**
 * DP
 * 有一个整型数组A,代表数值不同的纸牌排成一条线。
 * 玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家B后拿,
 * 但是每个玩家每次只能拿走最左或最右的纸牌,玩家a和玩家b都绝顶聪明,他们总会采用最优策略。
 * 请返回最后获胜者的分数。
 * 
        给定纸牌序列A及序列的大小n,请返回最后分数较高者得分数(相同则返回任意一个分数)。
        保证A中的元素均小于等于1000。且A的大小小于等于300。
 * @date 2017年7月24日 下午1:55:06
 * @description
 * 
 */
public class Poker {
    public int cardGame(int[] A, int n) {
    	int F[][] = new int[n][n];  //F[i][j]表示布局为i~j时先手的最大收益
    	int S[][] = new int[n][n];	//S[i][j]表示布局为i~j时后手的最大收益
    	//初始化 布局为i~i时,先手的收益为A[i]
    	for (int i = 0; i < F.length; i++) {
			F[i][i] = A[i];
		}
    	
    	//F[i][j] = max {A[i]+S[i+1][j], A[j]+ S[i][j-1]}
    	//S[i][j] = min {F[i+1][j], F[i][j-1]}
    	
    	//两重循环,算F|S[i][j]
    	//已知F|S[i][i]  可以作为切入点
    	for (int i = S.length -1; i >= 0; i--) {
			for (int j = i+ 1; j < S.length; j++) {
				F[i][j] = Math.max(A[i]+S[i+1][j], A[j]+ S[i][j-1]);
				S[i][j] = Math.min(F[i+1][j],F[i][j-1]);
			}
		}
    	return Math.max(F[0][n -1], S[0][n -1]);
    }
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值