洛谷P1430 序列取数

该博客详细介绍了洛谷P1430问题,即A和B轮流从长度不超过1000的序列中取数,A先手。双方的目标是最大化自己的得分,取数规则限定只能从一端开始取且不能同时从两端取。文章讨论了如何确保A能获得最高分数,并提供了输入输出格式和样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个长为n的整数序列(n<=1000),由A和B轮流取数(A先取)。每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取。所有数都被取走后,两人分别统计所取数的和作为各自的得分。假设A和B都足够聪明,都使自己得分尽量高,求A的最终得分。

输入输出格式

输入格式:

 

第一行,一个正整数T,表示有T组数据。(T<=100)

接着T行,每行第一个数为n,接着n个整数表示给定的序列.

 

输出格式:

 

输出T行,每行一个整数,表示A的得分

 

输入输出样例

输入样例#1: 

2
1 -1
2 1 2

输出样例#1: 

-1
3

说明

时限:3s

#include <bits/stdc++.h>
using namespace std;
int a[1010],sum[1010];
int dp[1010][1010]; 
int wzx[1010][1010],ljy[1010][1010];
int t,n;
int main() {
	cin>>t;
	    while (t--) {
        cin>>n;
        for (int i=1;i<=n;i++) cin>>a[i],sum[i]=sum[i-1]+a[i];
        for (int i=1;i<=n;i++) dp[i][i]=wzx[i][i]=ljy[i][i]=a[i];
        for (int l=2;l<=n;l++)
            for (int i=1;i<n;i++) {
                int j=i+l-1; if (j>n) break;
                int kkk=sum[j]-sum[i-1];
                dp[i][j]=kkk-min(0,min(wzx[i][j-1],ljy[i+1][j]));
                wzx[i][j]=min(wzx[i][j-1],dp[i][j]);
                ljy[i][j]=min(ljy[i+1][j],dp[i][j]);
            }
        printf("%d\n",dp[1][n]);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值