动态规划—14怪盗基德的滑翔翼

本文介绍了一种通过计算最大上升子序列和最大下降子序列来找出建筑物间最长滑行路径的算法。使用双数组记录从每个建筑出发可以达到的最远距离,并通过排序选取最优路径。

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

题目:有N栋建筑,每栋建筑高度不同,只能从高建筑滑向低建筑,求最多可以经过多少建筑。

解题思路:定义两个数组,利用i循环,用两个数组存从i向两边的最大上升子序列和最大下降子序列,循环一遍之后用sort函数将两个数组排序然后比较c[n-1]和d[n-1]的大小,大的那个即是要求的结果。

细节处理:用两个数组分别存最大上升子序列和最大下降子序列。

代码:#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,m,n,a[1001]={0},max;
cin>>m;
while(m--)
{
int c[1001]={0},d[1001]={0};
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
c[n-1]=1;
for(i=n-2;i>=0;i--)
{
for(max=0,j=n-1;j>i;j--)
{if((a[j]<a[i])&&(c[j]>max))
max=c[j];
}
c[j]=max+1;}
d[0]=1;
    for(i=1;i<n;i++)
{  
for(max=0,j=0;j<i;j++)
{if(a[j]<a[i]&&d[j]>max)
max=d[j];}
d[i]=max+1;}
sort(c,c+n);
sort(d,d+n);
if(c[n-1]>d[n-1])
cout<<c[n-1]<<endl;
else
cout<<d[n-1]<<endl;}
return 0;
}

感想:解决问题时可以换一种思路解决,例如本题就是求最大上升子序列和最大下降子序列中最大的那个。

### 关于信奥一本通在线评测系统中编号1286题目基德滑翔翼 #### 题目概述 该题属于动态规划中的路径优化类问题。背景设定为基德利用滑翔翼从一个高楼飞到另一个高楼,目标是在能量消耗最小的情况下完成飞行路线。 #### 动态规划模型构建 为了求解此问题,可以建立如下DP方程: 设`dp[i][j]`表示到达第i栋楼高度为j时所需的最少能量消耗,则状态转移方程可定义为: ```cpp for (int i = 1; i <= n; ++i) { for (int j = hmin; j <= hmax; ++j) { dp[i][j] = min(dp[i-1][k] + cost(i, k, j)) // 对所有可能的高度k进行枚举 } } ``` 其中`cost(i,k,j)`代表从上一栋楼高度k移动至当前楼层高度j所耗费的能量值[^1]。 #### 边界条件处理 初始化时需考虑起始位置的能量消耗设置以及不可达情况下的极大值赋初值操作,确保算法能够正常收敛得到最优解。 #### 时间复杂度分析 由于涉及到双重循环遍历每一对`(i,j)`组合,并且内部还需计算不同起点带来的额外开销,因此整体时间复杂度大约为O(n * m^2),这里n指代建筑物数量,m则对应最大允许变化范围内的高度差。 #### 测试案例建议 对于此类涉及具体数值运算的问题,在编写代码前应先准备好几组边界测试用例来验证逻辑正确性,比如当只有一座建筑、两座相邻高度相等/不等的情况等特殊情形下程序的行为是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值