dp专题 滑翔翼问题

来源:互联网 发布:网络歌手沫沫酱照片 编辑:程序博客网 时间:2024/04/29 00:10

1、简单描述

城市中一共有N幢建筑,初始时,可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向。他只能往下滑行。希望尽可能多地经过不同建筑的顶部,他最多可以经过多少幢不同建筑的顶部。

下降子序列的最长长度。

2、思路

#include<bits/stdc++.h>using namespace std;int n,m,i,j,k,h[110],f[110],g[110];int main(){cin>>n;while(n--) { cin>>m; for (j=1;j<=m;j++)  cin>>h[j]; memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); g[1]=1; f[1]=1; for(j=2;j<=m;j++) {  for (int l=1;l<=j-1;l++)   if (h[j]<h[l]&&f[j]<f[l])     f[j]=f[l];   f[j]++; } for (j=2;j<=m;j++)  {  for (int l=1;l<=j-1;l++)   if (h[j]>h[l]&&g[j]<g[l])    g[j]=g[l];  g[j]++;  } int ans1=0; for (j=1;j<=m;j++)  if (ans1<g[j])    ans1=g[j]; int ans=0; for (j=1;j<=m;j++)  if (f[j]>ans)    ans=f[j]; cout<<max(ans,ans1)<<endl; } return 0;}
从左到右遍历一遍,从右到左遍历一遍,找出两个结果中比较大的一个,输出结果。

0 0