题目:
A,B从M个员工里面选择人数,每人每次从左边开始选择1或者2个人,一直到结束,累计每个人选择的人数的总身高。A先开始选择,判断A是否能获得胜利。
思路:dp问题,dp[i]表示第i层时先拿的人能获得的最大身高总数。假设拿一块,能获得的最大总数为,a[i]+min(dp[i-2],dp[i-3]),既是另一个人选1或者2块后能获得的最大值。
同理 如果拿两块的化,最大值为a[i]+a[i-1]+min(dp[i-3],dp[i-4]).比较一下拿一块还是两块时能获得最多的既是最大利益。AC90%,剩下不知道是什么没过。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> re;
int t = n;
int sum = 0;
while(t--){
int tmp;
cin>>tmp;
sum+=tmp;
re.push_back(tmp);
}
reverse(re.begin(),re.end());
vector<int> dp(n,0);
dp[0] = re[0],dp[1] = re[0] + re[1];
dp[2] = re[1] +re[2],dp[3] = max(re[3] +min(dp[1],dp[0]),re[3]+re[2]);
for(int i = 4; i<n; i++){
dp[i] = min(re[i]+min(dp[n-2],dp[n-3]),re[i]+re[i-1]+min(dp[i-3],dp[i-4]));
}
if(dp[n-1]>sum-dp[n-1]) {
cout<<"true";
} else {
cout<<"false";
}
return 0;
}