Projeto e Análise de Algoritmos - Capítulo 2 - Algoritmo Recursivo

As características do método recursivo são: um problema requer uma série de cálculos.Há sempre uma certa relação entre as condições conhecidas e o problema.No cálculo, se a relação quantitativa entre os processos antes e depois pode ser encontrada (Ou seja, recursivo), então, do problema de passar gradualmente às condições conhecidas, esse método é chamado de backstepping. Seja para frente ou para trás, a chave é encontrar uma fórmula recursiva.
[ Exemplo 1 ] Triângulo digital. A figura abaixo mostra um triângulo digital. Por favor, compile um programa para calcular um caminho de cima para baixo em algum lugar, para que a soma dos números passados ​​pelo caminho seja a maior. Somente a soma total é necessária.  
1. Um passo pode descer a linha oblíqua esquerda ou a linha oblíqua direita;  
2. O número de linhas triangulares é menor ou igual a 100;
3. Os números no triângulo são 0, 1, ..., 99; Os dados de teste são inseridos linha por linha através do teclado, Os dados no exemplo acima devem ser inseridos no seguinte formato:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Insira a descrição da imagem aqui
[Análise de algoritmos] Existem muitas soluções para esse problema, começando pela idéia recursiva, imagine que, quando a parte superior Ao caminhar por um determinado caminho até a i-ésima camada e avançar para a i-ésima camada, nossa escolha deve ser avançar na direção do maior número nos próximos dois caminhos possíveis.Para esse fim, podemos usar o método de empurrão para trás, defina um [i] [j] armazena o valor máximo começando em i, j e alcançando a enésima camada, então a [i] [j] = max {a [i] [j] + a [i + 1] [j], a [ i] [j] + a [i + 1] [j + 1]}, a [1] [1] é o valor máximo da soma dos números.

#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;  
}

[ Exemplo 2 ] A sequência que satisfaz F1 = F2 = 1, Fn = Fn-1 + Fn-2 é chamada de sequência de Fibonacci (Fibonacci), e os primeiros itens são 1, 1, 2, 3, 5, 8 , 13, 21, 34 ... Encontre o enésimo termo desta sequência (n> = 3).
Ou seja: 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; 
} 

[ Exemplo 3 ] Há um quadrado retangular de 2χn e o quadrado é coberto com um dominó 1 * 2.
Insira a descrição da imagem aqui
Escreva um programa, tente qualquer um dos n (n> 0) fornecidos e imprima o número total de métodos de pavimentação.
A seguir, é apresentado um programa c ++ que insere n e gera 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;     
	} 
} 

[ Exemplo 4 ] Reprodução de insetos
[Descrição do problema] Os cientistas descobriram um tipo especial de inseto nas florestas tropicais.Este tipo de inseto tem forte capacidade de reprodução. Cada par de adultos deposita y pares de ovos após x meses e cada par de ovos cresce em adultos adultos após dois meses. Supondo que cada adulto não morra, há apenas um par de adultos no primeiro mês e o ovo não põe ovos no primeiro mês após o adulto crescer (postura dos ovos após X meses), quantos pares de adultos existem após Z meses? 0 = <X <= 20,1 <= Y <= 20, X = <Z <= 50
[formato de entrada] O valor de x, y, z
[formato de saída] Após Z meses, o número total de worms adultos
[entrada Amostra] 1 2 8
[Saída de amostra] 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; 
}		

[ Exemplo 5 ]
Problema com o número de dígitos [Descrição do problema] Entre todos os N dígitos, quantos deles têm um número par de 3? Como o resultado pode ser grande, você só precisa enviar o valor da resposta para 12345.
[Formato de entrada] Leia um número N
[Formato de saída] Existem números pares 3 na saída.
[Entrada de amostra] 2
[Saída de amostra] 73
[Tamanho dos dados] 1 <= N <= 1000
[Descrição da amostra] Entre todos os 2 dígitos, existem 72 incluindo 0 3, incluindo 2 3 Existem 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; 
}
Publicado 48 artigos originais · Gosto 25 · Visita 2453

Acho que você gosta

Origin blog.csdn.net/qq_43628959/article/details/105061314
Recomendado
Clasificación