洛谷P1028 [NOIP2001 普及组] 数的计算
思路:
记 f[n]
为n
的序列方案数字, 那么只需要找到 f[1]~f[n/2]
, 因为当前的数 n
, 可以在每个 1 ~ n/2
的序列前面加上一个 n
即可, 然后 n
自己也可以是一个序列, 故而可以得到递推式。
代码:
#include <iostream>
using namespace std;
const int N=1010;
int f[N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i/2;j++)
{
f[i]+=f[j];
}
f[i]++;
}
cout<<f[n];
return 0;
}
洛谷P1192 台阶问题
思路:
记f[i]
为i
个台阶的方案数,将f[i]
分为k
个情况
- 最后一步是跨1个台阶,
f[i-1]
- 最后一步是跨2个台阶,
f[i-2]
- …
- 最后一步是跨k个台阶,
f[i-k]
注意如果i
没有k
大时,就不能从1~k
,要从1~i
。
代码:
#include <iostream>
using namespace std;
const int N=1e5+10,mod=100003;
int f[N],n,k;
int main()
{
cin>>n>>k;
f[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=min(i,k);j++)
{
f[i]=(f[i]+f[i-j])%mod;
}
}
cout<<f[n];
return 0;
}
洛谷P1044 [NOIP2003 普及组] 栈
思路:
这题考的是卡特兰数,我是看y总的讲解之后才懂的,附上y总题解
代码:
#include <iostream>
using namespace std;
typedef long long LL;
const int N=40;
LL c[N][N];
int main()
{
int n;
cin>>n;
for(int i=0;i<=2*n;i++)
for(int j=0;j<=i;j++)
if(!j)c[i][j]=1;
else c[i][j]=c[i-1][j-1]+c[i-1][j];
cout<<c[2*n][n]/(n+1);
return 0;
}
洛谷P1003 [NOIP2011 提高组] 铺地毯
思路:
这题可以说是暴力枚举,先把所有地毯读入,然后从最后一块地毯可以枚举,判断其是否覆盖了题目中给的坐标,如果是直接输出第几块毛毯,如果最后没有地毯覆盖则输出-1
。
代码:
#include <iostream>
using namespace std;
const int N=10010;
int n, x[N], y[N], g[N], k[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ )
{
cin >> x[i] >> y[i] >> g[i] >> k[i];
}
int dx, dy;
cin >> dx >> dy;
for (int i = n-1; i >= 0; i -- )
{
if (x[i] <= dx && y[i] <= dy && x[i]+g[i] >= dx && y[i]+k[i] >= dy)
{
cout << i+1 << endl;
return 0;
}
}
cout << -1 << endl;
return 0;
}