传送门

题目大意:从一个序列两端取数,先后手两人

均采用最优策略,问先后手的得分。

题解:

区间dp

如果先手面临的状态是a1,a2,a3,a4,a5.

如果取走一个那么后手面临的状态是a2,a3,a4,a5、

同样也是一个最优值。

f[l][r]表示选手A面临[l,r]状态的最优值,那么选手B的最优值

就是区间[l,r]的区间和-f[l][r].

记忆化搜索用结构体返回两个玩家的得分

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 220
using namespace std;

int n;

int a[N],sum[N],f[N][N];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
     scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i],f[i][i]=a[i];
    for(int len=2;len<=n;len++){
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            f[l][r]=max(sum[r]-sum[l-1]-f[l+1][r],sum[r]-sum[l-1]-f[l][r-1]);
        }
    }
    printf("%d %d",f[1][n],sum[n]-f[1][n]);
    return 0;
}
dp

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-05-29
  • 2021-04-06
  • 2021-06-05
  • 2021-06-02
  • 2022-01-24
猜你喜欢
  • 2021-11-15
  • 2021-09-25
  • 2022-02-20
  • 2021-06-09
  • 2021-08-27
  • 2021-06-06
  • 2021-05-27
相关资源
相似解决方案