您的位置:首页 > 其它

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

2017-04-20 18:27 288 查看
题目:有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;

}

感想:解决问题时可以换一种思路解决,例如本题就是求最大上升子序列和最大下降子序列中最大的那个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: