P1255 数楼梯
题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入样例
4
输出样例
5
说明/提示
对于 60%60% 的数据,N≤50;
对于 100%100% 的数据,1≤N≤5000。
思路
高精加+斐波那契数列
题解
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int n,len=1,f[5003][5003];//f[k][i]--第k阶台阶所对应的走法数
void hp(int k)//高精度加法,k来存阶数
{
int i;
for(i=1;i<=len;i++)
f[k][i]=f[k-1][i]+f[k-2][i];//套用公式
for(i=1;i<=len;i++) //进位
if(f[k][i]>=10)
{
f[k][i+1]+=f[k][i]/10;
f[k][i]=f[k][i]%10;
if(f[k][len+1])len++;
}
}
int main()
{
int i;
scanf("%d",&n);
f[1][1]=1; f[2][1]=2; //初始化
for(i=3;i<=n;i++) //从3开始避免越界
hp(i);
for(i=len;i>=1;i--) //逆序输出
printf("%d",f[n][i]);
return 0;
}
P1044 [NOIP2003 普及组] 栈
题目描述
输入格式
输入文件只含一个整数 n(1≤n≤18)。
输出格式
输出文件只有一行,即可能输出序列的总数目。
输入样例
3
输出样例
5
思路
递归/记忆化搜索
题解
#include<iostream>
using namespace std;
typedef long long ll;
int n;
ll f[20][20];//外,内
int dfs(int x,int y)
{
if(f[x][y]) return f[x][y];
if(x==0) return 1;
if(y>0) f[x][y]+=dfs(x,y-1);
f[x][y]+=dfs(x-1,y+1);
return f[x][y];
}
int main()
{
cin>>n;
cout<<dfs(n,0);
return 0;
}
P1164 小A点菜
题目描述
不过 uim 由于买了一些书,口袋里只剩 M 元(M≤10000)。
餐馆虽低端,但是菜品种类不少,有 N 种(N≤100),第 i 种卖ai 元(ai≤1000)。由于是很低端的餐馆,所以每种菜只有一份。
小 A 奉行“不把钱吃光不罢休”,所以他点单一定刚好把 uim 身上所有钱花完。他想知道有多少种点菜方法。
由于小 A 肚子太饿,所以最多只能等待 1 秒。
输入格式
第一行是两个数字,表示 N 和 M。
第二行起 N 个正数ai(可以有相同的数字,每个数字均在1000 以内)。
输出格式
一个正整数,表示点菜方案数,保证答案的范围在 int 之内。
输入样例
4 4
1 1 2 2
输出样例
3
思路
代码
#include<iostream>
using namespace std;
int N,M;
int n[105],f[105][10050];
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++) cin>>n[i];
for(int i=0;i<=N;i++) f[i][0]=1;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
f[i][j]+=f[i-1][j];
if(j>=n[i]) f[i][j]+=f[i-1][j-n[i]];
}
}
cout<<f[N][M];
return 0;
}
//二维转换为一维
#include<iostream>
using namespace std;
int N,M;
int n[105],f[10050];
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++) cin>>n[i];
f[0]=1;
for(int i=1;i<=N;i++)
{
for(int j=M;j>=n[i];j--)
{
f[j]=f[j]+f[j-n[i]];
}
}
cout<<f[M];
return 0;
}
P1990 覆盖墙壁
输入样例
13
输出样例
3465
说明/提示
数据保证,1≤N≤1000000。
题解
#include<iostream>
using namespace std;
const int N=1000050;
const int mod=10000;
int f[N],g[N];
int n;
int main()
{
cin>>n;
f[0]=f[1]=g[1]=1;
for(int i=2;i<=n;i++)
{
f[i]=((f[i-1]+f[i-2])%mod+2*g[i-2]%mod)%mod;
g[i]=(g[i-1]+f[i-1])%mod;
}
cout<<f[n];
return 0;
}
P1928 外星密码
输入样例
AC[3FUN]
输出样例
ACFUNFUNFUN
题解
#include<bits/stdc++.h>
using namespace std;
string read()
{
int n;
string s="",s1;
char c;
while (cin>>c)//一直读入字符,直到Ctrl+z
{
if (c=='[')
{
cin>>n;//读入D
s1=read();//读入X
while (n--) s+=s1;//重复D次X
//注:上面不能写成while (n--) s+=read();
}
else
{
if (c==']') return s;//返回X
else s+=c;//如果不是'['和']',那就是X的一个字符,所以加进X
}
}
}
int main()//巨短主函数
{
cout<<read();
return 0;
}