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;
}
};