ZOJ 1108 FatMouse's Speed

本文介绍了一种求解最长递增子序列问题的算法实现,通过结构体存储元素信息并利用排序和动态规划思想来寻找序列中的最长递增子序列。文章详细展示了算法的具体步骤,包括输入数据处理、关键数据结构定义、比较函数实现及最终递增子序列的回溯输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<string>
#include<algorithm>//sort()
#include<iostream>
using namespace std;
struct Rat{ int num, w, s; };
int k = 0, w, s; Rat rat[1000];
void init()
{
	while (cin >> w >> s)
	{
		rat[k].num = k + 1;
		rat[k].w = w; rat[k].s = s;
		k++;
	}
}
bool cmp(Rat a, Rat b)//结构体Rat没有定义小于运算 要定义比较函数cmp才能调用sort函数
{
	if (a.w != b.w) return a.w<b.w;
	else return a.s>b.s;
}
void path(int *p, Rat *rat, int start)
{
	if (start == -1) return;
	path(p, rat, p[start]);
	cout << rat[start].num << endl;
}
int main()
{
	int c[1000] = { 0 }, p[1000]; c[0] = 1;
	memset(p, -1, sizeof(p));
	init();
	sort(rat, rat + k + 1, cmp);
	for (int i = 1; i <= k; i++)
	{
		for (int j = 0; j<i; j++)
		{
			if (rat[j].w<rat[i].w&&rat[j].s>rat[i].s)
				if (c[i]<c[j]){ c[i] = c[j]; p[i] = j; }
		}
	c[i]++;
	}
	int max = 0, start;
	for (int i = 0; i <= k; i++)
	{
		if (max<c[i]) { max = c[i]; start = i; }
	}
	cout << max << endl;
	path(p, rat, start);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值