【洛谷P1028】数的计算
易知,n=1时,有1个数列;n=2,有2个数列。
若n=4,则有三种情况:
(1)4之后没有数
(2)4之后为2
(3)4之后为1
所以f(4)=f(2)+f(1)+1
归纳得,f(n)=f(i)+1
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,ans=1;
int a[1010];
cin>>n;
//ans=line(n);
for(int i=1;i<=n/2;i++){
a[i]=1;
for(int j=1;j<=i/2;j++){
a[i]+=a[j];
}
ans+=a[i];
}
cout<<ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[100010];//在第i个台阶上的方式
int main(){
int n,k;
int m=100003;
cin>>n>>k;
a[0]=1;
a[1]=1;
for(int i=2;i<=n;i++){
for(int j=i-1;j>=i-k&&j>=0;j--)
a[i]=(a[i]+a[j])%m;
//cout<<a[i]<<endl;
}
cout<<a[n];
return 0;
}
【洛谷P1192】台阶问题
当每一次最多迈k个台阶,所以到第n阶的方式数就等于到第n-1阶、第n-2阶……第n-k阶的方式数之和,即f(n)=f(n-1)+f(n-2)+……f(n-k)
#include <bits/stdc++.h>
using namespace std;
int a[100010];//在第i个台阶上的方式数
int main(){
int n,k;
int m=100003;
cin>>n>>k;
a[0]=1;
a[1]=1;
for(int i=2;i<=n;i++){
for(int j=i-1;j>=i-k&&j>=0;j--)
a[i]=(a[i]+a[j])%m;
//cout<<a[i]<<endl;
}
cout<<a[n];
return 0;
}
【洛谷P1044】栈
对于n个数,pop和push两个操作一共进行2n次,分别记为1和-1,则操作序列应满足任意前k项之和大于等于0,且2n项之和为0。列举几个发现1 3 5 ……满足卡特兰数。
卡特兰数两种算法:
一、
公式 f(n)=
由于n=18时分母过大爆了,所以不好用
二、
递推公式 f(n)=f(0)*f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)
代码如下(被注释起来的是第一种方法):
#include <bits/stdc++.h>
using namespace std;
int a[100]={1};
int main(){
int n;
long long ans=0,up=1,down=1;
cin>>n;
/*
for(int i=n+2;i<=2*n;i++){
up*=i;
}
for(int i=1;i<=n;i++){
down*=i;
}
ans=up/down;
cout<<up<<' '<<down<<endl;
cout<<ans;
*/
for(int i=0;i<= n;i++){
for(int j=0;j<i;j++){
a[i]+=a[j]*a[i-j-1];
}
//cout<<a[i]<<endl;
}
cout<<a[n];
return 0;
}
【洛谷P2011】铺地毯
单纯的模拟罢了
#include <bits/stdc++.h>
using namespace std;
struct map{int a,b,g,k;
}m[10010];
int main(){
int n,x,y;
int flag=-1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>m[i].a>>m[i].b>>m[i].g>>m[i].k;
}
cin>>x>>y;
for(int i=n;i>0;i--){
if(x>=m[i].a &&x<=m[i].a+m[i].g &&y>=m[i].b &&y<=m[i].b+m[i].k){
flag=i;
break;
}
}
cout<<flag;
return 0;
}