Tarte gratuite (programmation dynamique des tours de comptage)

 Tarte gratuite

On dit qu'il n'y aura pas de tartes qui tomberont 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 maître agile dans le jeu, ses nerfs moteurs sont particulièrement lents en réalité et il ne peut attraper la tarte qui tombe que dans une plage ne dépassant pas un mètre par seconde. Donnez maintenant les coordonnées de ce sentier comme indiqué dans l'icône:


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 à la position 5, donc dans la première seconde, il ne pouvait recevoir une tarte 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)

Saisir

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 <n <100000), ce qui signifie que n pies sont tombés sur ce chemin. Dans les n lignes résultantes, chaque ligne a deux entiers x, T (0 <T <100000), ce qui signifie qu'un secteur tombe sur le point x au deuxième T. Plusieurs tartes peuvent tomber au même point dans la même seconde. Lorsque n = 0, l'entrée se termine.

Sortir

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

Idées:

Équation de programmation dynamique: dp [i] [j] + = max (dp [i + 1] [j], max (dp [i + 1] [j + 1], dp [i + 1] [j-1] ));

Représente l'avantage maximal qui peut être obtenu de la i seconde à la j position

dp [i] [j] représente le nombre de tartes qui tombent à la position j à la i-ième seconde

 Code d'implémentation:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int dp[100001][20];//行表示时间,列表示位置 
int main()
{
	int i,j,k,n,x,t;
	while(~scanf("%d",&n))
	{
		if(n==0)
		break;
		else
		{
			int e;
			memset(dp,0,sizeof(dp));//初始化dp 
			while(n--)
			{
				scanf("%d%d",&x,&t);
				dp[t][x+1]++;//这里都往前一位,
				e=max(e,t);//得出最大的时间,这样也比用if来写更简洁 
			}
			for(i=e;i>=0;i--)//时间由最大到0秒时 
			{
				for(j=1;j<=11;j++)//位置由1到11 
				{
					dp[i][j]+=max(dp[i+1][j],max(dp[i+1][j+1],dp[i+1][j-1]));//因为max是判断两者之间。我们要得出三个数中的最大,用两个max 
				}
			}
			printf("%d\n",dp[0][6]);
		}
	}
}

 

Je suppose que tu aimes

Origine blog.csdn.net/with_wine/article/details/114435029
conseillé
Classement