Lintcode 硬币排成线

来源:互联网 发布:html5个人网站源码 编辑:程序博客网 时间:2024/05/17 05:55

http://www.jianshu.com/p/42656455eefc
这篇文章分析的很好!
说明一点: 我们每次取硬币,最多只能下一次。 所以只考虑本次 和下一次。

当i = len-4以及以后的情况中,显然可以选择拿一个或者拿两个两种情况,我们自然是选择拿最多的那个作为dp的值,那么我们就分分析这两种情况:
第一种,只拿一个,那么对手可能拿两个或者一个,对手肯定是尽可能多拿,所以我们要选择尽可能小的那个,所以dp[i] = values[i] + min(dp[i+2],dp[i+3])

第二种,拿两个 dp[i] = values[i]+ values[i+1]+min(dp[i+3],dp[i+4])

然后我们取这两种情况下的最大值。

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();          if (n < 3)          {              return true;          }          int buf[n+1];          buf[n] = 0;          buf[n-1] = values[n-1];          buf[n-2] = values[n-2] + values[n-1];          buf[n-3] = values[n-3] + values[n-2];          int sum = values[n-3] + values[n-2] + values[n-1];          for (int i = n-4; i >= 0; i--)          {              int a = values[i] + min(buf[i+2], buf[i+3]);              int b = values[i] + values[i+1] + min(buf[i+3], buf[i+4]);              buf[i] = max(a, b);              sum += values[i];          }          return buf[0] > sum-buf[0];      }  };  
原创粉丝点击