HDU1160 胖老鼠的速度 dp lis的活用,玄学改bug

版权声明:那个,最起码帮我加点人气吧,署个名总行吧 https://blog.csdn.net/qq_41670466/article/details/83794889

题意大致就是:求出一个最长的重量递增,速度递减的序列,并记录路径,这道题本身并不难,只是lis的活用,难的是调bug!!!!,我改了两天,怎末改都是WA,直到刚刚,我从g++换成了c++,就ac了,哭。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

using namespace std;

const  int maxn = 1e3 + 10;
struct MOUSE
{
		int weight;
		int speed;
		int place;
}mouse[maxn];
int dp[maxn], path[maxn], re[maxn];//dp[I] 表示第I个位置时的最长序列的长度;

void ini(int n)
{
		for (int i = 1; i <= n; i++)
		{
				dp[i] = 1;
		}
		//memset(dp, 0, sizeof(dp));
		memset(path, 0, sizeof(path));
		memset(re, 0, sizeof(re));
}

void solve(int n)
{
		for (int i = 1; i <= n; i++)
		{
				for (int j = 1; j < i; j++)
				{
						if (mouse[j].weight<mouse[i].weight&&mouse[j].speed > mouse[i].speed&&dp[i] < dp[j] + 1)
						{
								path[i] = j;
								dp[i] = dp[j] + 1;
						}
				}
		}
		int mx = 0;
		int point = 0;
		for (int i = 1; i <= n; i++)
		{
				if (mx < dp[i])
				{
						mx = dp[i];
						point = i;
				}
		}
		printf("%d\n", mx);
		int t = 0;
		int po = point;
		for (int i = 0; i < n; i++)
		{
				re[i] = point;
				point = path[point];
		}
		for (int i = mx - 1; i >= 0; i--)
		{
				printf("%d\n", mouse[re[i]].place);
		}
}

bool cmp(MOUSE a, MOUSE b)
{
		if (a.weight == b.weight)
				return a.speed > b.speed;
		return a.weight < b.weight;
}

int main()
{
		int a, b;
		int i = 1, n = 0;
		while (scanf("%d %d", &a, &b) != EOF)
		{
				mouse[i].weight = a;
				mouse[i].speed = b;
				mouse[i].place = i;
				n++;
				i++;
		}
		ini(n);
		sort(mouse + 1, mouse + 1 + n, cmp);
		solve(n);
		//system("pause");
		return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/83794889
今日推荐