/*
translation:
给定一组老鼠的体重和速度,求出这样的一组老鼠数列,使得老鼠的体重在增加,速度在减少。
solution:
dp,lis
首先按照重量对老鼠进行排序,然后按照普通lis做法即可。
note:
1.题目题意有问题,说是求sebsequence,但是按照子序列的定义来看,求出来的根本不是子序列。比如样例第9个数据组
竟然在第7个数据组之前!!而子序列的要求是“不改变数据在原数据串中的相对顺序”。题意明显有问题!
2.即使对重量进行了排序,但是在lis中任然要对重量进行限制,以保持严格增长。因为任然有可能出现重量相等却将其计入lis
的情况。
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1000 + 5;
struct Mouse
{
int weight, speed;
int id;
} m[maxn];
int dp[maxn], pre[maxn];
void printAns(int id)
{
if(pre[id] == -1) {
cout << m[id].id + 1 << endl;
return;
}
printAns(pre[id]);
cout << m[id].id + 1 << endl;
}
bool cmp(const Mouse &lhs, const Mouse &rhs)
{
return lhs.weight == rhs.weight ?
lhs.speed > rhs.speed : lhs.weight < rhs.weight;
}
int main()
{
//freopen("in.txt", "r", stdin);
int n;
while(cin >> m[n].weight >> m[n].speed) {
m[n].id = n;
n++;
}
sort(m, m + n, cmp);
memset(pre, -1, sizeof(pre));
int res = 0, endId;
for(int i = 0; i < n; i++) {
dp[i] = 1;
for(int j = 0; j < i; j++) {
if(m[j].speed > m[i].speed && m[j].weight < m[i].weight) {
if(dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
pre[i] = j;
}
}
}
if(res < dp[i]) {
res = dp[i];
endId = i;
}
}
cout << res << endl;
printAns(endId);
return 0;
}
hdu1160(dp的lis模型)
最新推荐文章于 2020-05-06 14:14:47 发布