摘要: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; }
原文地址:http://blog.csdn.net/trochiluses/article/details/39642017