假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?
每组测试数据包含两行:第一行是一个整数N(N < 100),代表有N幢建筑。第二行包含N个不同的整数,每一个对应一幢建筑的高度h(0 < h < 10000),按照建筑的排列顺序给出。
3 8 300 207 155 299 298 170 158 65 8 65 158 170 298 299 155 207 300 10 2 1 3 4 5 6 7 8 9 10
669
思路: 这个 就是 从头 到尾 求出 最大下降 子序列 ,然后 从尾到头 求出 最大 下降子序列 ,然后 输出 这两个数字的 最大 的哪个 。
#if 0
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("in.txt","r",stdin) ;
int k ;
cin >> k ;
while (k--)
{
int a[105] ,max ,b[105]={0} ,max1=1,max2 =1;
int n;
cin >> n;
for(int i=1 ;i<= n ; i++)
{
cin >> a[i] ;
}
b[1]=1;
for(int i=2 ; i<=n ;i++)
{ max = 0;
for(int j=1 ;j < i ; j++)
{
if(a[i]>a[j])
if(b[j]>max) max = b[j] ;
}
b[i] = max+1;
if(max1 < b[i]) max1=b[i] ;
}
max = 0 ;
memset(b,0,sizeof(b)) ;
b[n] = 1;
for(int i=n-1 ; i>=1 ;i--)
{ max= 0 ;
for(int j=n ;j > i ; j--)
{
if(a[i] > a[j])
if(max < b[j]) max = b[j] ;
}
b[i] = max +1;
if(max2 <b[i]) max2 =b[i] ;
}
if(max1>max2) cout<<max1 <<endl;
else cout << max2 <<endl;
}
}
#endif
本文探讨了一道动态规划问题,涉及怪盗基德如何利用滑翔翼从高楼依次滑翔至低楼,以最大化经过的建筑数量。问题要求确定在不能改变方向的情况下,基德最多能经过多少不同的建筑顶部。
2518

被折叠的 条评论
为什么被折叠?



