题目连接:
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1052
题目类型:
动态规划
数据结构:
struct STAIRS
{
int height;
int step;
};
思路分析:
----------------------------------------------------------------------------------------------------------------
动态规划的思路.
根据位置排列,不然走的顺序就会被打乱.
并且每一个点均包含从该点到最后的可行的M条路径,并且包含关于此点的1条最优路径.
依次分析每个点到最后的所有路径,并选择最优路径为答案.
先正向分析:
从开始往N的方向,从每个点出发能形成一个树.每个支都是一条路,并且后面的节点可能重复经过.所以如果从0往N的过程中会存在多个点被重复计算该处到N的多条路径.
逆向分析:
既然从0到N中会走过很多相同的路径.那么不妨从N往0走,这样每个点到N的路径就可以依赖它到达下一个点的路径.因为下一个点的路径也包含那个点到N的所有路径.所以这就形成了重复子问题性质.所以从逆向路径走的话,能避免许多的重复计算.
证明:
略
源代码:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <set>
using namespace std;
struct STAIRS
{
int height;
int step;
};
int main()
{
int i,j,n,maxs,tmp,tmp_maxs;
STAIRS stairs[10001];
while(scanf("%d",&n)!=EOF)
{
maxs=0;
for(i=0;i<n;i++)
{
scanf("%d",&tmp);
stairs[i].height=tmp;
stairs[i].step=0;
}
for(i=n-2;i>=0;i--)
{
tmp_maxs=0;
for(j=i+1;j<n;j++)
if(stairs[j].height>stairs[i].height)
if(stairs[j].step+1>tmp_maxs) tmp_maxs=stairs[j].step+1;
stairs[i].step=tmp_maxs;
if(tmp_maxs>maxs) maxs=tmp_maxs;
}
printf("%d\n",maxs+1);
}
return 0;
}