赞
踩
题目链接:https://www.acwing.com/problem/content/1390/
思路:对区间进行动态规划,f[i][j]代表从区间i到j的先手所能拿到的最大值
- #include<bits/stdc++.h>
- using namespace std;
- const int N=105;
-
- int fg[N][N];
-
- int main(){
- int n;cin>>n;
- vector<int>a(n+1);
- int sum[N]={ };
- for(int i=1;i<=n;i++){
- cin>>a[i];
- sum[i]=sum[i-1]+a[i];
- fg[i][i]=a[i];
- }
-
-
- for(int len=2;len<=n;len++){
- for(int i=1;i<=n-len+1;i++){
- int j=i+len-1;
- //先手所能拿到的最大值是当前这一段总值减去后手最大值
- fg[i][j]=max(sum[j]-sum[i-1]-fg[i+1][j],sum[j]-sum[i-1]-fg[i][j-1]);
- }
- }
- cout<<fg[1][n]<<' '<<sum[n]-fg[1][n]<<'\n';
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。