• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

HDU 1160 FatMouse's Speed dp

        这题是看杭电acm课件做的,和一维的最长有序子序列差不多。

        先按mice的重量为第一关键字升序排序,再按mice的speed按降序排序,然后开始dp

        对杭电课件那个记录数组的意义不理解。

        num[i]是记录从0~i个mice的最长子序列,num[i] = max (num[j]+1, num[i]) , 0<= j < i

        一开始用string保存路径输出,不断地WA,想了很久,才发现问题,我每次用一个char保存当前的节点,char是值是0~2^8,会越界

       后来查考别人输出方法,每个节点保存一个前节点,最后一个递归输出即可。

       对memset又加深了理解,memset不能对int数组赋值,例如不能给整个数组赋值为1, 它是按位赋值的,一个int是4个位,它会把所有位都赋值为1,得到的就不是1了。

#include <iostream>
#include <algorithm>
#define MAX 1005
using namespace std;

struct Mice
{
	int id;
	int weight;
	int speed;
	int pre;
};


bool cmp(const Mice& a, const Mice& b)
{
	if (a.weight < b.weight)
		return true;
	else if (a.weight == b.weight)
		return a.speed > b.speed;
	else
		return false;
}

int num[MAX];
Mice mice[MAX];

void output(int);

int main()
{
	int count = 0;

	while (cin >> mice[count].weight >> mice[count].speed)
	{
		mice[count].id = count+1;
		count++;
	}

	
	sort(mice, mice+count, cmp);

 	num[0] = 1;
	mice[0].pre = 0;

	for (int i = 1; i < count; i++)
	{
		num[i] = 1;
		mice[i].pre = i;

		for (int j = 0; j < i; j++)
		{
			if (mice[i].weight > mice[j].weight && mice[i].speed < mice[j].speed)
			{
				if (num[i] < num[j]+1)
				{
					num[i] = num[j]+1;
					mice[i].pre = j;
				}
			}
		}

	}

	int max_index = 0;
	for (int i = 1; i < count; i++)
		if (num[i] > num[max_index])
			max_index = i;
			
	cout << num[max_index] << endl;

	output(max_index);
	return 0;
}


void output(int index)
{
	if (num[index] == 1)
		cout << mice[index].id << endl;
	else
	{
		output(mice[index].pre);
		cout << mice[index].id << endl;
	}
}

posted on 2010-12-15 16:51  sysuwhj  阅读(625)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3