计算机机试指南-动态规划

本文介绍了动态规划在解决实际问题中的应用,如N阶楼梯上楼问题和装错信封问题。对于楼梯问题,算法思路是f(n)=f(n-1)+f(n-2)。而在装错信封问题中,通过分析错误情况,得出错误方式的数量。此外,还讨论了一个导弹拦截系统的问题,通过动态规划确定最多能拦截多少导弹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值