预测赢家-动态规划法
给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。
玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。
假设每个玩家的玩法都会使他的分数最大化,输出赢家分数。
int win(vector<int>& vec){//返回获胜者分数
int n = vec.size();
vector<vector<int>>fdp(n,vector<int>(n,0));
vector<vector<int>>gdp(n,vector<int>(n,0));
for(int i = 0;i<n;i++){
fdp[i][i] = vec[i]; //先手
gdp[i][i] = 0; //后手
}
//对角线依赖
for(int startcol = 1;startcol <n;startcol ++){
int l = 0;
int r = startcol;
while(r<n){
fdp[l][r] = max(gdp[l+1][r]+vec[l] ,gdp[l][r-1] + vec[r]);
gdp[l][r] = min(fdp[l+1][r],fdp[l][r-1]);
l++;
r++;
}
}
return max(fdp[0][n-1], gdp[0][n-1]);
}
int main(){
vector<int>vec{1,100,4,4,5};
cout<<win1(vec)<<endl;
return 0;
}
作者:想玩飞盘的山羊拥抱太阳
链接:https://www.nowcoder.com/discuss/659508294435799040?sourceSSR=users
来源:牛客网
