雅虎笔试题目——最大集合问题

1 篇文章 0 订阅

摘要:sort函数在日常编程中,经常被用到;同时,对内存的初始化函数,经常用到fill,本节,我们以计算LIS为例讲解这两个函数的应用。

例子:有一些老鼠,有x和y两个属性,现在要选择一个最大集合,其中从前到后,老鼠的x属性依次递减,y属性依次递增。


分析:如果我们先按照x属性递减排列,那么形成一个数组,然后问题就转化为求解这个数组中y属性递增排列的最长字串,于是转化为一个动态规划问题。

关键点2:在动态规划的解法中,我们仅仅记录了最长的集合长度,那么如何将集合恢复出来?这里,我们用到了“前缀树”的思想:在很多搜索结构中,我们往往需要搜索一种路径,然而,从某个点开始的路径可能有很多条,但是每个点的前缀节点仅仅有一个。在这种情况下,我们仅仅需要记录某个节点的前缀节点,然后就能恢复出来这条路径。


写这道题目的时候,犯下的错误:

sort函数的递减排列;

memset函数,开始使用这个函数对int类型进行了非零的初始化,比如memset(len, 1, 12*4);想想这里为什么出错?这个函数的定义式子是什么样的?


具体的算法如下:

#include <iostream>
#include <iomanip>
#include <vector>
#include<cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <climits>

using namespace std;
struct mice{
	int x;
	int y;
	mice(){}
	mice(int x1, int y1):x(x1), y(y1){}
};

struct mycom{
	bool operator()(mice a, mice b)const{
		return (b.x<a.x);
	}
}Com;

int main(int argc, char *argv[])
{
	mice my[12];
	int i, res=-1, resindex=-1;
	for (i = 0; i < 12; ++i){
		my[i]=mice(rand()%100, rand()%100);
	}
	sort(my, my+12, Com);
	
	int len[12];	
	fill(len, len+12, 1);

	int pre[12];
	memset(pre, -1, 12*4);
	fill(pre, pre+12, -1);

	for (int i = 1; i < 12; ++i){
		for(int k=0; k<i;k++){
			if(my[i].y > my[k].y && len[k]+1 > len[i]){
				len[i]=len[k]+1;
				pre[i]=k;	
			}	
		}
		if(len[i]>res){
			res= len[i];
			resindex = i;
		}
	}
	stack<int> s;
	int curindex=resindex;
	while(curindex!=-1){
		s.push(curindex);	
		curindex = pre[curindex];
	}
	cout << res <<endl;
	while(s.empty()==false){
		int index= s.top();
		s.pop();
		cout << my[index].x << " " <<my[index].y <<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值