alice和bob玩游戏,有两个序列a和b,a和b中都有n个元素,alic和bob依次从a或b序列的最左边或最右边拿走一个树,alice先拿,求alice最后拿到数之和最大是多少。
这是一种博奕类的动态规划题目,假设a序列中剩下a_i到a_j之间的数,b序列中剩下b_i到b_j之间的数,alice能拿到的最多数用dp[a_i][a_j][b_i][b_j]这个四维数组表示,此时alice可以那a中最左边或最右边的数也可以拿b中最左边或最右边的数,alice拿了a中最左边数之后bob能拿到的最多数就是dp[a_i+1][a_j][b_i][b_j];alice拿了a中最右边的数之后,bob能拿到的最多数就是dp[a_i][a_j-1][b_i][b_j];alice拿了b中最左边数之后bob能拿到的最多数就是dp[a_i][a_j][b_i+1][b_j];alice拿了b中最右边数之后bob能拿到的最多数就是dp[a_i][a_j][b_i][b_j-1]。bob拿了之后那a中a_i到a_j和加b中b_i到b_j和减去bob拿到的最多数就是alice能拿到的最多数。这里的dp不是特指alice能拿到的最多数或bob能拿到的最多数,而是无论是谁在这两区间内能拿到的最大数,注意dp的维度应为(N+2)(N+2)(N+2)*(N+2) 所以:
d
p
[
a
i
]
[
a
j
]
[
b
i
]
[
b
j
]
=
M
a
x
(
d
p
[
a
i
+
1
]
[
a
j
]
[
b
i
]
[
b
j
]
,
d
p
[
a
i
]
[
a
j
−
1
]
[
b
i
]
[
b
j
]
,
d
p
[
a
i
]
[
a
j
]
[
b
i
+
1
]
[
b
j
]
,
d
p
[
a
i
]
[
a
j
]
[
b
i
]
[
b
j
−
1
]
)
dp[a_i][a_j][b_i][b_j]=Max(dp[a_i+1][a_j][b_i][b_j],dp[a_i][a_j-1][b_i][b_j],dp[a_i][a_j][b_i+1][b_j],dp[a_i][a_j][b_i][b_j-1])
dp[ai][aj][bi][bj]=Max(dp[ai+1][aj][bi][bj],dp[ai][aj−1][bi][bj],dp[ai][aj][bi+1][bj],dp[ai][aj][bi][bj−1])
import java.util.Scanner;
public class AliceGame {
static int helper(int[] a,int[] b,int a_i,int a_j,int b_i,int b_j,int[][][][] dp) {
int sum_a=0;
for(int i=a_i-1;i<a_j;i++) {
sum_a+=a[i];
}
int sum_b=0;
for(int i=b_i-1;i<b_j;i++) {
sum_b+=b[i];
}
if(a_i>a_j && b_i>b_j) return 0;
if(dp[a_i][a_j][b_i][b_j]!=0)
return dp[a_i][a_j][b_i][b_j];
int ans=0;
if(a_i<=a_j) {
ans=Math.max(ans,sum_a+sum_b-helper(a,b,a_i+1,a_j,b_i,b_j,dp));
ans=Math.max(ans,sum_a+sum_b-helper(a,b,a_i,a_j-1,b_i,b_j,dp));
}
if(b_i<=b_j) {
ans=Math.max(ans, sum_a+sum_b-helper(a,b,a_i,a_j,b_i+1,b_j,dp));
ans=Math.max(ans, sum_a+sum_b-helper(a,b,a_i,a_j,b_i,b_j-1,dp));
}
return dp[a_i][a_j][b_i][b_j]=ans;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T=sc.nextInt();
while(T-->0){
int N=sc.nextInt();
int[] a=new int[N];
int[] b=new int[N];
int[][][][] dp=new int[N+2][N+2][N+2][N+2];
for(int i=0;i<N;i++){
a[i]=sc.nextInt();
}
for(int i=0;i<N;i++){
b[i]=sc.nextInt();
}
System.out.println(helper(a,b,1,N,1,N,dp));
}
}
}