P1028 数的计算
这题看懂了就会发现:
因此代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int main()
{
int n;
cin>>n;
int ans[N]={0};
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i/2;j++)
ans[i]+=ans[j];
ans[i]++;
}
cout<<ans[n];
return 0;
}
P1192 台阶问题
类似的题以前写过的,不过这题最大的步数变了,也是个变量了
这样就有点难绷了,但是经过枚举k的值,还是能发现其中规律的
k=2 n=1 2 3 5 8 13 21 34...
k=3 n=1 2 4 7 13 24 44 81...
k=4 n=1 2 4 8 15 29 56 108...
k=5 n=1 2 4 8 16 31 61 120...
由此不难看出,n的值从第一个到第k个成等比数列,公比为2,可以看做下一个数等于前一个数的2倍,而到了第k+1个数,在第k个数2倍的基础上,需要减去相应的值,才能得到目标数,结合k,n的关系,就能得出规律了,代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int mod=100003;
int main()
{
int n,k;
cin>>n>>k;
long long f[N];
memset(f,0,sizeof(f));
f[0]=f[1]=1;
for(int i=2;i<=n;i++)
{
if(i<=k)
f[i]=(f[i-1]*2)%mod;
else
f[i]=(f[i-1]*2-f[i-k-1])%mod;
}
cout<<(f[n]);
return 0;
}
P1044 栈
这题看了好久都没看明白,直到看完课了解到了卡特兰数,omg,豁然开朗
下面是递归公式
#include<bits/stdc++.h>
using namespace std;
const int N=1e7;
int f[N];
int main()
{
int n;
cin>>n;
memset(f,0,sizeof(f));
f[0]=1,f[1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
f[i]+=f[i-j]*f[j-1];
cout<<f[n];
return 0;
}
其实卡特兰数的性质还有:
通项公式:
递推公式:
递归公式:
P1003铺地毯
这题就是看新的地毯是否能把前一个地毯覆盖,若可以则记下这个地毯序号即可
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int main()
{
int n;
int a[N],b[N],j[N],k[N];
int x,y,l=-1;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i]>>b[i]>>j[i]>>k[i];
cin>>x>>y;
for(int i=1;i<=n;i++)
if(x>=a[i]&&y>=b[i]&&x<=a[i]+j[i]&&y<=k[i]+b[i])
l=i;
cout<<l;
return 0;
}