zoj 1108 FatMouse's Speed 简单动规

                                                                                              FatMouse's Speed
 

 

题目较为简单,但是我一开始做输出的时候,为了达到先找到头结点在向后输出采用了stack

但是后来改进的递归输出的确更加的高明。

#include <iostream>
#include <algorithm>
using namespace std;
#define size 1010

int dp[size];	//存储值
int pre[size];
struct mouse{
	int index, weight, speed;
}a[size];

bool cmp(mouse a,mouse b)
{
	if(a.weight == b.weight)
		return a.speed > b.speed;
	return a.weight < b.weight;
}

void output(int i){
	if(pre[i] == 0){
		cout<<a[i].index<<endl;
		return;
	}
	output(pre[i]);
	cout<<a[i].index<<endl;
}

int main(){
	freopen("in.txt", "r", stdin);
	int i, j, num_mouse = 1, Max_i = 0, Max = 0;	//Max_i为最大上升子序列最后一个节点的位置,Max表示获得的最大个数
	while(cin>>a[num_mouse].weight>>a[num_mouse].speed){
		a[num_mouse].index = num_mouse;
		num_mouse++;
	}
	sort(a + 1, a + num_mouse, cmp);

	dp[1] = 1;
	for(i = 2; i < num_mouse; i++){
		dp[i] = 1;
		for(j = 1; j < i; j++){
			if(a[i].weight > a[j].weight && a[i].speed < a[j].speed && dp[j] + 1 > dp[i]){
				dp[i] = dp[j] + 1;
				pre[i] = j;			//i的前驱为j,主要用于输出
				if(dp[i] > Max){	//让Max保持的是最大个数
					Max = dp[i];	
					Max_i = i;		//Max_i最大个数的结尾位置
				}
			}
		}
	}
	cout<<Max<<endl;
	output(Max_i);
	return 0;
}


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值