洛谷P1430 序列取數

題目描述

給定一個長爲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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章