A game——hihoCoder173

来源:互联网 发布:嘉年华st轮毂数据 编辑:程序博客网 时间:2024/06/06 02:11

这个题目是今年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取值


原创粉丝点击