Jeu de jeu HDU-4597 (jeu + intervalle dp)

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 dp [i] [j] [p] [q] premier tableau est restant  [i, j] et que le deuxième tableau est restant  [P, q] , 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;
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43871207/article/details/109783072
conseillé
Classement