题意大致就是:求出一个最长的重量递增,速度递减的序列,并记录路径,这道题本身并不难,只是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;
}