解决递推的关键:是找递推表达式(它往往与前几项有关)
1.P1028 [NOIP2001 普及组] 数的计算
用递归会超时
#include<iostream>
using namespace std;
#include<cstring>
#include<cmath>
#define min(x,y) (x<y?x:y)
int n,ans;
int a[2000];
void go(int n)
{
for(int i=1;i<=n/2;i++)
{
ans++;
go(i);
}
}
int main()
{
cin>>n;
go(n);
cout<<ans+1;
}
递推:
#include<iostream>
using namespace std;
#include<cstring>
#include<cmath>
#define min(x,y) (x<y?x:y)
int n;
int a[2000];
int main()
{
cin>>n;
a[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i/2;j++)
{
a[i]+=a[j];
}
a[i]=a[i]+1;
}
cout<<a[n];
}
2.矩阵2
//卡特兰数
#include<iostream>
using namespace std;
#include<cstring>
#include<cmath>
#define min(x,y) (x<y?x:y)
int n,ans;
int a[2000];
int main()
{
cin>>n;
a[0]=a[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<i;j++)
{
a[i]+=(a[j]*a[i-j-1])%100;
}
}
cout<<a[n]%100;
}
3.P1595 信封问题
错排问题
4.打印质因子模板
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn=pow(2,31);
int a[50];
int main(){
cin>>n;
a[1]=a[2]=1;
for(int i=3;i<=n;i++)
{
a[i]=(a[i-1]+a[i-2])%maxn;
}
int j=0;
cout<<a[n]<<"=";
for(int i=2;i<=a[n];i++)
{
while(a[n]%i==0)
{
j++;
if(j==1)
cout<<i;
else
cout<<"*"<<i;
a[n]/=i;
}
}
}
5.多次差分找规律
#include <iostream>
using namespace std;
unsigned long long Count(int s)
{
unsigned long long Ans=1,i,j1=4,j2=4,j3=2;
for(i=1;i<s;i++)
{
Ans+=j1;
j1+=j2;
j2+=j3;
if(j3==2)j3=1;
else if(j3==1)j3=2;
}
return Ans;
}
int main()
{
int n,s;
cin >> n;
for(int i=0;i<n;i++)
{
cin >> s;
cout << Count(s) << endl;
}
return 0;
}