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
[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.
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;
}