在线编程-最长递增子序列&货架堆数(11.8)

最长递增子序列长度

背景题,大意就是产品经理寻求技术人员帮助,从一长串数据中,找出最长的递增子序列(不一定连续,但是顺序不能乱)的长度。

动态规划法:
长度为n的数组{a0,a1,…,an-1},假设以aj结尾的数组序列是最长递增子序列,长度为L(j),则L(j) = { max(L(i))+1,i<j且a[i]<a[j] }。即在计算到达j位置时的最长递增序列长度时,要对j之前的所有位置 i (0到j-1) 进行遍历,找到a[i]<a[j]的L(i),并取max(L(i))+1作为L(j)的值。

以数组[5,6,7,1,2,8]为例子的动态规划示意图

int maxIncreaseListLen(vector<int> arr){
	int len=arr.size();
	if(len<=1) return 0;
	
	int *list=new int[len];
	for(int i=0;i<len;i++)	//初始化,每个元素单独成为一个子序列,长度为1
		list[i]=1;
	
	for(int j=1; j<len; j++)	//从1位置开始,对每个元素进行检验
		for(int i=0; i<j; i++)	
			if(arr[j]>a[i] && list[j]<list[i]+1)	//两个条件,缺一不可
				list[j]=list[i]+1;
	
	int max=0;
	for(int i=0;i<len;i++)
		max=max>list[i]? max:list[i];
	
	return max;	
}

货架内有多少个物品堆

背景题,大意是给你二维数组,判断数组内由1组成的“堆”(上下左右相连)的个数
题目并不难,关键是要注意给定的数据格式vector<vector< char >>

暴力遍历法:
对整个矩阵进行遍历检查,当检查到为‘1’时,将能与其相连位置上的‘1’全部置零即可。
*注意到如下图的<右上角>和<左侧边>突出‘1’的情况。
0 0 1 0 1 0
0 1 1 1 1 1
0 0 1 0 0 1
1 0 0 0 1 0

void check(vector<vector<char>> &prid, int m,int n, int i, int j){
	prid[i][j]='0';
	if(p[i+1][j]=='1' && i+1<m) check(prid, m,n, i+1,j);
	if(p[i][j+1]=='1' && j+1<n) check(prid, m,n, i,j+1);
	if(p[i-1][j]=='1' && i-1>0) check(prid, m,n, i-1,j);
	if(p[i][j-1]=='1' && j-1>0) check(prid, m,n, i,j-1);
}
int maxNum(vector<vector<char>> &prid){
	int m=prid.size();
	if(m==0) return 0;
	int n=prid[0].size();
	
	int rob=0;
	for(int i=0;i<m;i++)
		for(int j=0;i<n;j++)
			if(prid[i][j]=='1'){	//此处一定要注意是==‘1’,不是==1.不然调试死活找不着
				rob++;
				check(prid, m,n, i,j);
			}
	return rob; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值