zoj 1108 FatMouse's Speed

这么简单的题,还写了好久,还错了,,

代码能力太菜了,慢慢练,,

求最长的上升子序列,不过有两个限制,体重要求严格下降速度严格上升

代码是瞄了别人的,自己做了写注释吧,,

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <memory.h>
#include <limits.h>
#include <stack>
#define N 1010
using namespace std;
typedef struct
{
	int w,s,num;
}MICE;
MICE mice[N];
stack<int> S;
int cmp(const void *a,const void *b)
{
	MICE *x = (MICE*)a;
	MICE *y = (MICE*)b;
	if( x->w == y->w )
		return -y->s + x->s;
	else
		return x->w - y->w;
}
int ind[N];
int main(void)
{
	int n=0,len[N];

	while( cin >> mice[n].w >> mice[n].s )
	{
		mice[n].num = n;
		n++;
	}


	memset(ind,0,sizeof(ind));
	memset(len,0,sizeof(len));
	qsort(mice,n,sizeof(MICE),cmp);


	len[0] = 1;
	for(int i=1; i<n; i++)
	{

		int sum = 0,temp;
        //SUM用来记录当前下的最长的子串长度,temp用来存前该元素的一个值
		for(int j=0; j<i; j++)
			if( len[j] > sum && mice[i].w > mice[j].w && mice[i].s < mice[j].s )
			{
                    //len[j]>sum 选取满足条件的最长的j
					temp = j;//i的前一个元素为j
					sum = len[j];//以j结尾下的最长的子串
			}

		if( sum != 0 )
			ind[i] = temp;//记录下满足条件的前面的元素为temp
		else
			ind[i] = 0;
		sum++;//长度加1
		len[i] = sum;
		//以i结尾的最大长度
	}
	int max = 0,tempi;
	for(int i=0; i<n; i++)
		if( len[i] > max )
			max = len[tempi=i];//取得最长值,同时求得最后一个元素
	cout << max << endl;
	int i = tempi;
	while( ind[i] != 0 )
	{
		S.push(mice[i].num+1);
		i = ind[i];
	}
	//将存的子串反向输出
	S.push(mice[i].num+1);
	while( !S.empty() )
	{
		cout << S.top() << endl;
		S.pop();
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值