【HDU1160】一点点技巧的DP

本文深入解析了最长递增子序列(LIS)算法在解决特定老鼠参数问题中的应用。通过实例讲解了如何利用DP(动态规划)和并查集中的pre[i]=j思想来记录中间信息并输出结果,最终实现对老鼠体重和速度数据的有效处理。

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

1.题目链接。题目大意:给出一些老鼠的参数,每一行两个数据,第一个是老鼠的体重,第二个是速度,求出一组这样的老鼠,他们的体重在增加,但是速度在减小。尽可能是这个数量最多。输出这些老鼠的数量和对应的编号。

2.就是一个LIS问题,但是这里我们需要记录中间信息并且输出,我们在输入的时候给每一个老鼠就加上编号,然后按照体重排序DP即可,至于信息的记录,我们可以采用并查集中的pre[i]=j,这个数组的思想,pre[i]就是代表i的上一个数据是j,这样就一条链表一样完整的记录下了信息,其实在跑最短路的时候输出最短路的节点也是这样做的。代码奉上:

#include<bits/stdc++.h>
#include <iostream>
#include <algorithm>
using namespace std;
#pragma warning(disable:4996)
const int maxn = 1005;
struct node
{
	int  w, s, ind;
	bool operator <(const node &n)const {
		if (w >= n.w)return true;
		else if (w == n.w) return s<n.s;
		else return false;
	}

}mice[maxn];

int dp[maxn];
int pre[maxn];
int main()
{
	int w, s;
	int ind = 0, pos = 0;
	while (scanf("%d%d", &w, &s) != EOF) {
		mice[ind].w = w;
		mice[ind].s = s;
		mice[ind].ind = ind + 1;
		ind++;
	}
	sort(mice, mice + ind);
	for (int i = 0; i<ind; i++)dp[i] = 1;
	memset(pre, -1, sizeof(pre));
	for (int i = 0; i<ind; i++) {
		for (int j = 0; j<i; j++) {
			if (mice[j].w>mice[i].w&&mice[j].s<mice[i].s) {
				if (dp[i]<dp[j] + 1) {
					dp[i] = dp[j] + 1;
					pre[i] = j;
				}
			}
		}
	}
	int ans = -1;
	for (int i = 0; i<ind; i++) {
		if (ans<dp[i]) {
			ans = dp[i];
			pos = i;
		}
	}
	printf("%d\n", dp[pos]);
	while (pos != -1) {
		printf("%d\n", mice[pos].ind);
		pos = pre[pos];
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值