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

来源:互联网 发布:淘宝微任务是什么 编辑:程序博客网 时间:2024/06/04 18:53

题目:有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;
}

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

0 0