这个题目是今年360春招的题目,这是链接
用的是动态规划,先上代码:
int n;
int a[1010], dp[1010][1010];
int main(){
cin>>n;
for(int i = 0; i<n; i++){
cin>>a[i];
}
if(n&1){
for(int i = 0; i<n; i++)
dp[i][i] = a[i];
}
for(int i = 1; i<n; i++){
for(int j = 0; j+i<n; j++){
if(((n+i)&1) == 0){
dp[j][j+i] = min(dp[j+1][j+i], dp[j][j+i-1]);
}else{
dp[j][j+i] = max(dp[j+1][j+i] + a[j], dp[j][j+i-1] + a[j+i]);
}
}
}
cout<<dp[0][n-1];
return 0;
}
在链接里的解释说明的很清楚了,这里添加以下解释:
1、dp[ i ][ j ]指的是在区间 i-j 范围内A能取到的最大值
2、第一个(n&1),即判断n的奇偶性。(dp[i][i]是初值,即为区间为1)当n是奇数时,说明A会拿到最后一个元素,故在此区间内(区间长度为1时)A能取到的最大值即为该元素的值,于是需要赋值给dp的初值;而当n为偶数时,A拿不到最后一个元素,故在此区间(区间长度为1)A能取到的最大值为0,故dp的初值为0(不赋初值)
3、(n+I)&1意为该B取值,反之则为轮到A取值