TOJ 1052


题目连接:

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值