WEEK_3(递推)

P1028 数的计算

这题看懂了就会发现:f(n)=\sum_{k=0}^{n/2} f(k)

因此代码如下

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

其实卡特兰数的性质还有:

通项公式:\frac{_{2n}^{n}\textrm{C}}{n+1}= _{2n}^{n}\textrm{C}-_{2n}^{n+1}\textrm{C}

递推公式:\frac{4n-2}{n-1}f(n-1)

递归公式:f(n)=f(0)*f(n-1)+f(1)*f(n-2)+...+f(n-1)*f(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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值