HDU1160 FatMouse's Speed(DP+路径记录)

最长上升子序列算法实现
本文介绍了一种解决特定问题的算法实现,即输入一组小鼠的体重和速度后,如何找出体重升序且速度降序的最大子序列,并输出该序列中小鼠的数量及具体序号。采用排序加动态规划的方法,通过记录路径最终递归输出结果。

题意:

输入一组小鼠的体重和速度,要求输出体重从小到大而速度从大到小的数目最多的小鼠的数量和具体序号。

要点:

简单的最长上升子序列,只要先排序再DP即可,就是要记录一下路径最后递归输出就行。


174476802016-07-06 14:10:34Accepted11600MS1732K958 BC++seasonal
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
	int w, s;
	int pos;
}mice[1005];
int dp[1005], path[1005];

int cmp(node a, node b)
{
	if (a.w == b.w)
		return a.s > b.s;
	return a.w < b.w;
}
void print(int x)//递归输出路径
{
	if (x == -1)
		return;
	print(path[x]);
	printf("%d\n", mice[x].pos+1);
}
int main()
{
	int i, j, count = 0;
	while (scanf("%d%d", &mice[count].w, &mice[count].s)!=EOF)
	{
		mice[count].pos = count;
		count++;
	}
	sort(mice, mice + count, cmp);
	for (i = 0; i < count; i++)
		dp[i] = 1;
	memset(path, -1, sizeof(path));
	for(i=0;i<count;i++)
		for(j=0;j<i;j++)
			if (mice[i].w > mice[j].w&&mice[i].s < mice[j].s&&dp[i] < dp[j] + 1)
			{
				dp[i] = dp[j] + 1;
				path[i] = j;//记录前驱
			}
	int ans = -1, num;
	for(i=0;i<count;i++)
		if (ans < dp[i])
		{
			ans = dp[i];
			num = i;
		}
	printf("%d\n", ans);
	print(num);
	return 0;
}


转载于:https://www.cnblogs.com/seasonal/p/10343716.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值