Alice et Bob jouent à un jeu. Il y a deux piles de cartes. Il y a N cartes dans chaque pile et chaque carte a un score. Ils prennent à tour de rôle la carte du haut ou du bas de l'une ou l'autre pile et le score de la carte sera ajouté à son score total. Alice et Bob sont tous les deux assez intelligents et ramasseront des cartes pour obtenir le plus de points possible. Savez-vous combien de points Alice peut obtenir s'il décroche en premier?
Saisir
La première ligne contient un entier T (T≤100), indiquant le nombre d'observations.
Chaque étui contient 3 lignes. La première ligne est le N (N≤20). La deuxième ligne contient N entier ai (1≤ai≤10000). La troisième ligne contient N entier bi (1≤bi≤10000).
Production
Pour chaque cas, affichez un entier, indiquant le score maximal qu'Alice peut obtenir.
Exemple d'entrée
2 1 23 53 3 10 100 20 2 4 3
Exemple de sortie
53 105
Le sens de la question: Alice et Bob se relaient pour prendre des nombres dans deux tableaux, chaque fois qu'ils ne peuvent prendre que le premier ou le dernier nombre d'un tableau, demandez à Alice de prendre la somme maximale des nombres
Idée: Lorsque le premier tableau est restant et que le deuxième tableau est restant , la valeur maximale que la personne qui effectue l'étape suivante peut obtenir, elle peut être transférée à partir de la valeur maximale de l'autre partie à l'étape précédente, 4 méthodes de transfert: le premier du tableau, le dernier du tableau un, le premier du tableau deux, le dernier du tableau deux.
La boucle for est vraiment difficile à écrire ou à mémoriser la recherche 8
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 25;
int a[N], b[N], dp[N][N][N][N], n;
int dfs(int i, int j, int p, int q, int sum) {
if(i > j && p > q) return 0;
if(dp[i][j][p][q]) return dp[i][j][p][q];
if(i <= j) {
dp[i][j][p][q] = max(dp[i][j][p][q], sum - dfs(i + 1, j, p, q, sum - a[i]));
dp[i][j][p][q] = max(dp[i][j][p][q], sum - dfs(i, j - 1, p, q, sum - a[j]));
}
if(p <= q) {
dp[i][j][p][q] = max(dp[i][j][p][q], sum - dfs(i, j, p + 1, q, sum - b[p]));
dp[i][j][p][q] = max(dp[i][j][p][q], sum - dfs(i, j, p, q - 1, sum - b[q]));
}
return dp[i][j][p][q];
}
int main(){
// freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
int sum = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
}
for(int i = 1; i <= n; ++i) {
scanf("%d", &b[i]);
sum += b[i];
}
memset(dp, 0, sizeof(dp));
printf("%d\n", dfs(1, n, 1, n, sum));
}
return 0;
}