1.N阶楼梯上楼问题
题目描述:N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。(非递归)
输入:输入包括一个整数N(1<=N<90)
输出:有多组测试数据,对于每组数据,输出当楼梯阶数为N时的上楼方式个数
算法思想:到达第n阶楼梯的方式有两种:从第n-1阶楼梯走一阶;从第n-2阶楼梯走两阶。故f(n)=f(n-1)+f(n-2)
//N阶楼梯上楼问题,一次可以走一阶或者两阶,上楼方式种数
#include<stdio.h>
long long f[91];
int main(){
f[1]=1;
f[2]=2;
for(int i=3;i<=90;i++){
f[i]=f[i-1]+f[i-2];
}
int n;
while(scanf("%d",&n)>0){
printf("%d",f[n]);
}
return 0;
}
2.装错信封问题
问题描述:为n个朋友每人写了一封信,求全部装错信封的错误方式种数
输入:包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(1<n<=20),n表示朋友个数
输出:对于每行输入请输出可能的错误方式数量,每个实例占用一行
算法思想:若n号信封装的是k号信封的信,m号信封装的是n号信封的信,若m和k相等,则交换两个信封内的信,除它们之外的剩余n-2个信封都装错,m共有n-1种,共有(n-1)*f(n-2);若m和k不相等,则交换两个信封后,除第n号信封之外剩余n-1个信封都装错,共有(n-1)*f(n-1)
//装错信封
#include<stdio.h>
long long f[21];
int main(){
f[1]=0;
f[2]=1;
for(int i=3;i<=20;i++){
f[i]=(i-1)*f[i-1]+(i-1)*f[i-2];
}
int n;
while(scanf("%d",&n)>0){
printf("装错信封的错误方式数为:%lld\n",f[n]);
}
}
3.最长递增子序列问题
问题描述:某一导弹拦截系统有一缺陷,第一发炮弹能够达到任意的高度,但是以后的每一发炮弹都不能超过前一发的高度。雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能够拦截多少导弹。
输入:每组输入有两行,第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),第二行输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击事件顺序给出,以空格分隔。
输出:每组输出只有一行,包含一个整数,表示最多能拦截多少导弹
//拦截导弹,最长子序列
#include<stdio.h>
//#include<math.h>
int buf[26];
int bibuf[26];
int main(){
int k;
while(scanf("%d",&k)!=EOF){
for(int i=1;i<=k;i++){
scanf("%d",&buf[i]);
}
bibuf[1]=1;
for(int i=2;i<=k;i++){
int temp=1;
for(int j=1;j<i;j++){
if(buf[i]<=buf[j]){
temp=bibuf[j]+1;
}
}
bibuf[i]=temp;
}
int tmax=1;
for(int i=2;i<=k;i++){
if(tmax<bibuf[i])tmax=bibuf[i];
}
printf("%d\n",tmax);
}
return 0;
}