动态规划—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;
}
感想:解决问题时可以换一种思路解决,例如本题就是求最大上升子序列和最大下降子序列中最大的那个。
解题思路:定义两个数组,利用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;
}
感想:解决问题时可以换一种思路解决,例如本题就是求最大上升子序列和最大下降子序列中最大的那个。
相关文章推荐
- 动态规划练习--14(怪盗基德的滑翔翼)
- 动态规划 怪盗基德的滑翔翼
- 动态规划:怪盗基德的滑翔翼
- C++动态规划之怪盗基德的滑翔翼(openjudge)
- 动态规划练习一 14:怪盗基德的滑翔翼
- 14:怪盗基德的滑翔翼
- 动态规划练习题-14(怪盗基德的滑翔翼)
- 动态规划练习一—14怪盗基德的滑翔翼
- 动态规划练习14:怪盗基德的滑翔翼
- 算法细节系列(14):动态规划之字符串处理
- 《Thinking In Algorithm》14.由背包问题了解动态规划和贪心
- 动态规划练习一 14:怪盗基德的滑翔翼
- ACM-动态规划14-怪盗基德的滑翔翼
- 动态规划14之1019
- 14:怪盗基德的滑翔翼
- 14:怪盗基德的滑翔翼
- 100道动态规划——14 UVA 1412 Fund Management 从刘汝佳dalao的代码里学到了很多。。。。
- 14:怪盗基德的滑翔翼
- 14:怪盗基德的滑翔翼
- 动态规划1(老师的讲义,我拷下来的呵呵)