解题报告:硬币排成线 II

本文通过动态规划的方法解决了一个两人轮流取硬币的游戏问题。详细介绍了如何从最简单的两个硬币场景开始逐步构建复杂场景的解决方案,最终实现了一个C++程序来判断先手玩家是否能赢得游戏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.lintcode.com/zh-cn/problem/coins-in-a-line-ii/

差不多用了2天时间,而且幸亏做硬币排成线一二,才有些思路的。

左右都可以取硬币,先把所有的2个的最优解和对手最优解算出来,然后做3个的硬币的,4个的以此类推,因为做3个的时候需要用2个的,做4个时需要用3个的

class Solution {
public:
    /**
     * @param values: a vector of integers
     * @return: a boolean which equals to true if the first player will win
     */
   bool firstWillWin(vector<int> &values) {
        // write your code here
		 int n=values.size();
		 vector<vector<pair<int,int>>> d(n,vector<pair<int,int>>(n,make_pair(0,0)));   
		 if(n==1)return true; 
		 for(int i=1;i<n;i++){ 
			 for(int j=0;j<n;j++){
				 int start=j;
				 int end=j+i; //i为每次加的数字 
				 if(end<n) 
					 if(end-start>1){
						 if(values.at(start)+d[start+1][end].second>values.at(end)+d[start][end-1].second){
							 d[start][end].first=values.at(start)+d[start+1][end].second; 
							 d[start][end].second=d[start+1][end].first;
						 }else{
							 d[start][end].first=values.at(end)+d[start][end-1].second; 
							 d[start][end].second=d[start][end-1].first; 
						 } 
					  }
					 else{
						 d[start][end].first=max(values.at(start),values.at(end));  
						 d[start][end].second=min(values.at(start),values.at(end));   
					 } 
			 }
		 }
		 return d[0][n-1].first>=d[0][n-1].second;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值