【HDU1176】 Tarte gratuite (problème de tour de comptage de type)

Tarte gratuite

Limite de temps: 2000/1000 MS (Java / autres) Limite de mémoire: 65536/32768 K (Java / autres)

Description du problème

On dit qu'il n'y aura pas de tartes dans le ciel, mais un jour, le gameboy marchait sur le chemin du retour, et soudain, beaucoup de tartes sont tombées du ciel. Dit le personnage de gameboy est vraiment bon, cette tarte n'est tombée nulle part ailleurs, elle est tombée à moins de 10 mètres de son côté. Si la tarte tombe sur le sol, bien sûr, elle ne peut pas être mangée, alors le gameboy a immédiatement retiré son sac à dos pour le ramasser. Mais comme il n'y a personne des deux côtés du sentier, il ne peut ramasser que sur le sentier. Parce que Gameboy reste généralement dans la pièce pour jouer à des jeux, bien qu'il soit un joueur très agile dans le jeu, ses nerfs moteurs sont particulièrement lents en réalité, et il ne peut attraper les tartes qui tombent que dans une plage ne dépassant pas un mètre par seconde. Donnez maintenant les coordonnées de ce sentier comme l'icône:
Écrivez la description de l'image ici

Afin de simplifier le problème, supposons que dans la prochaine période de temps, la tarte tombera dans les 11 positions de 0 à 10. Au début, le gameboy se tenait en position 5, donc dans la première seconde, il ne pouvait recevoir le gâteau que dans l'une des trois positions 4, 5 et 6. Combien de tartes au maximum Gameboy peut-il recevoir? (En supposant que son sac à dos puisse contenir un nombre infini de tartes)

Contribution

Il existe plusieurs groupes de données d'entrée. La première ligne de chaque groupe de données est un entier positif n (0

Production

Chaque ensemble de données d'entrée correspond à une ligne de sortie. Affiche un entier m, indiquant que gameboy peut recevoir au plus m pies.

Conseil : la quantité de données d'entrée pour cette question est relativement importante. Il est recommandé d'utiliser scanf pour lire. L'utilisation de cin peut expirer.

Exemple d'entrée

6
5 1
4 1
6 1
7 2
7 2
8 3
0

Exemple de sortie

4

Analyse du problème:
Écrivez la description de l'image ici

Comme indiqué ci-dessus, il y a dp [] [] avec N lignes et M colonnes

N représente les secondes, M représente cette coordonnée

Lorsqu'une seconde arrive, nous pouvons choisir de commencer à marcher à gauche, à droite ou en bas au point (1,5). Donc, à partir de la deuxième ligne dp[i][j]=max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+num[i][j], le plus grand des trois plus le nombre de tarte à cet endroit est le nombre maximum de tarte qui peut être mangé à ce stade.

Nous avons donc poussé jusqu'à la dernière ligne pour trouver que le plus grand nombre est le plus grand nombre de tarte que nous pouvons manger.

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"

using namespace std;

const int maxn = 1e5+5;

int dp[maxn][12];

int num[maxn][12];

int m;

int a,b,time;

int LL;

int main(){
    while( ~scanf("%d",&m),m ){
        LL = 0;
        memset(num,0,sizeof(num));
        memset(dp,0,sizeof(dp));
        while(m--){
            scanf("%d%d",&b,&a);
            num[a][b]++;
            if(a > LL){
                LL=a;
            }
        }

        dp[1][5]=num[1][5];
        dp[1][4]=num[1][4];
        dp[1][6]=num[1][6];
        for( int i=2 ; i<=LL ;i++ ){
            for( int j=0 ; j<=10 ; j++ ){
                dp[i][j] = max(dp[i-1][j-1],(max(dp[i-1][j],dp[i-1][j+1]))) + num[i][j];
            }
        }
        int ans = 0;
        for( int j=0 ; j<=10 ; j++ ){
            if(dp[LL][j]>=ans){
                ans = dp[LL][j];
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/thesprit/article/details/52026889
conseillé
Classement