Conception et analyse d'algorithmes - Chapitre 2 Algorithme récursif

Les caractéristiques de la méthode récursive sont les suivantes: un problème nécessite une série de calculs Il existe toujours une certaine relation entre les conditions connues et le problème résolu. (Autrement dit, récursif), puis, du problème à pousser progressivement vers les conditions connues, cette méthode est appelée backstepping. Que ce soit en avant ou en arrière, la clé est de trouver une formule récursive.
[ Exemple 1 ] Triangle numérique. La figure ci-dessous montre un triangle numérique. Veuillez compiler un programme pour calculer un chemin de haut en bas quelque part, afin que la somme des nombres passés par le chemin soit la plus grande. Seule la somme totale est requise.  
1. Une étape peut descendre la ligne oblique gauche ou la ligne oblique droite;  
2. Le nombre de lignes triangulaires est inférieur ou égal à 100;
3. Les nombres dans le triangle sont 0, 1, ..., 99; Les données de test sont entrées ligne par ligne via le clavier, Les données de l'exemple ci-dessus doivent être saisies au format suivant:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Insérez la description de l'image ici
[Analyse algorithmique] Il existe de nombreuses solutions à ce problème, à partir de l'idée récursive, imaginez que lorsque le haut En marchant le long d'un certain chemin vers la i-ème couche et en avançant vers la i + 1-ème couche, notre choix doit être d'avancer dans la direction du plus grand nombre dans les deux prochains chemins possibles. [i] [j] stocke la valeur maximale à partir de i, j et atteignant la nième couche, puis a [i] [j] = max {a [i] [j] + a [i + 1] [j], a [ i] [j] + a [i + 1] [j + 1]}, a [1] [1] est la valeur maximale de la somme des nombres.

#include<iostream> 
using namespace std; 
int main() 
{   
	int n,i,j,a[101][101];   
	cin>>n;
	for (i=1;i<=n;i++)    
		for (j=1;j<=i;j++)      
			cin>>a[i][j];                             
	for (i=n-1;i>=1;i--)    
		for (j=1;j<=i;j++)
		{      
			if (a[i+1][j]>=a[i+1][j+1]);
				a[i][j]+=a[i+1][j];    
			else  
				a[i][j]+=a[i+1][j+1];      
		}    
		cout<<a[1][1]<<endl;  
}

[ Exemple 2 ] La séquence qui satisfait F1 = F2 = 1, Fn = Fn-1 + Fn-2 est appelée la séquence de Fibonacci (Fibonacci), et les premiers éléments sont 1, 1, 2, 3, 5, 8 , 13, 21, 34 ... Trouvez le nième terme de cette séquence (n> = 3).
Soit: f1 = 1 (n = 1)
f2 = 1 (n = 2)
fn = fn-1 + fn-2 (n> = 3)

#include<iostream> 
#include<cstdio> 
using namespace std; 
int main() 
{     
	int f0=1,f1=1,f2;     
	int n;     
	cin>>n;
	for (int i=3; i<=n; ++i)     
	{          
		f2=f0+f1;          
		f0= f1;          
		f1=f2;     
	} 
	printf("%d\n",f2); 
	return 0; 
} 

[ Exemple 3 ] Il y a un carré rectangulaire de 2χn, et le carré est recouvert d'un domino 1 * 2.
Insérez la description de l'image ici
Écrivez un programme, essayez l'un des n (n> 0) donnés et affichez le nombre total de méthodes de pavage.
Ce qui suit est un programme c ++ qui entre n et sort x1 ~ xn:

#include<iostream> 
using namespace std; 
int main() 
{   
	int n,i,j,a[101];   
	cout<<"input n:";                       
	cin>>n;
	a[1]=1;a[2]=2;   
	cout<<"x[1]="<<a[1]<<endl;   
	cout<<"x[2]="<<a[2]<<endl;   
	for (i=3;i<=n;i++)                   
	{
		a[i]=a[i-1]+a[i-2];      
		cout<<"x["<<i<<"]="<<a[i]<<endl;     
	} 
} 

[ Exemple 4 ] Reproduction d'insectes
[Description du problème] Les scientifiques ont découvert un type particulier d'insecte dans les forêts tropicales, ce type d'insecte a une forte capacité de reproduction. Chaque paire d'adultes pond y paires d'oeufs après x mois, et chaque paire d'oeufs se développe en adultes adultes après deux mois. En supposant que chaque adulte ne meurt pas, il n'y a qu'une seule paire d'adultes le premier mois et l'œuf ne pond pas d'œufs le premier mois après la croissance de l'adulte (pondant des œufs après X mois), combien de paires d'adultes y a-t-il après Z mois? 0 = <X <= 20,1 <= Y <= 20, X = <Z <= 50
[format d'entrée] La valeur de x, y, z
[format de sortie] Après Z mois, le nombre total de vers adultes
[entrée Échantillon] 1 2 8
[Échantillon de sortie] 37

#include<iostream> 
using namespace std; 
int main() 
{   
	long long a[101]={0},b[101]={0},i,j,x,y,z;   
	cin>>x>>y>>z;
	for(i=1;i<=x;i++){a[i]=1;b[i]=0;}   
		for(i=x+1;i<=z+1;i++)              
		{     
			b[i]=y*a[i-x];     
			a[i]=a[i-1]+b[i-2];             }
		cout<<a[z+1]<<endl;   
		return 0; 
}		

[ Exemple 5 ]
Problème de nombre de chiffres [Description du problème] Parmi tous les N chiffres, combien d'entre eux ont un nombre pair de 3? Étant donné que le résultat peut être important, il vous suffit de sortir la valeur de la réponse à 12345.
[Format d'entrée] Lecture en nombre N
[Format de sortie] Il y a même des nombres 3 dans la sortie.
[Exemple d'entrée] 2
[Exemple de sortie] 73
[Taille des données] 1 <= N <= 1000
[Description de l'échantillon] Parmi les 2 chiffres, il y en a 72 dont 0 3, dont 2 3 Il y a 1 de 73

#include<iostream> 
using namespace std; 
int main() 
{   
	int f[1001][2],n,i,x;   
	cin>>n;
	f[1][1]=1;f[1][0]=9;                           
	for(i=2;i<=n;i++)     
	{          
		x=f[1][0];       
		if(i==n)
			x--;
		f[i][0]=(f[i-1][0]*x+f[i-1][1])%12345;       
		f[i][1]=(f[i-1][1]*x+f[i-1][0])%12345;       
	}    
	cout<<f[n][0];     
	return 0; 
}
A publié 48 articles originaux · Comme 25 · Visite 2453

Je suppose que tu aimes

Origine blog.csdn.net/qq_43628959/article/details/105061314
conseillé
Classement