/*
问题简单描述:
输入一组数据,每行两个数,
第一个是老鼠的体重,第二个是老鼠的速度,
从中找出体重越大,速度越小的序列,这个序列越长越好
输出的第一个数是这个序列的个数
接着是这些序列中的元素所在的位置
解题思路:
先按体重排序,就是一个最大下降子序列的问题。
*/
#include <iostream>
using namespace std;
struct Node
{
int weight;
int speed;
int num;
int pre;
}a[1002];
int cmp(const void *a, const void *b)
{
if( ( (Node *) a) -> weight == ( (Node *) b) -> weight)
return ( ( (Node *) b) -> speed - ( (Node *) a) -> speed);
return ( (Node *) a) -> weight - ( (Node *) b) -> weight;
}
int main( )
{
int i, j, v=1, flag, max;
int dp[1005] = {0};
while( scanf("%d%d", &a[v].weight, &a[v].speed) != EOF )
a[v].num = v++;
v--;
for(i = 1; i <= v; i++)
dp[i] = 1;
qsort(a+1, v, sizeof(Node), cmp); // 这里是单个元素占用空间大小,不能写成 sizeof(a)
max = 1;
for(i = v; i >= 1; i--)
{
for(j = i + 1; j <= v; j++)
{
if(a[i].weight < a[j].weight && a[i].speed > a[j].speed && dp[i] < (dp[j] + 1) )
{
dp[i] = dp[j] + 1;
a[i].pre = j;
if(dp[i] > max)
{
max = dp[i];
flag = i;
}
}
}
}
cout << max << endl;
for( i = 1; i <= max; i++)
{
cout << a[flag].num << endl;
flag = a[flag].pre;
}
return 0;
}
HDOJ 1160 FatMouse's Speed
最新推荐文章于 2021-08-29 11:17:03 发布