FatMouse's Speed |
题目大意:
给定一些老鼠的体重和速度,要求找出一些序列,体重逐渐增加,速度逐渐减小。要求输出序列中老鼠的个数与编号,答案不唯一。典型的最长是上升子序列问题,但是这个输出编号不会弄。网上找的博客是定义一个数组,数组中存储这个编号的上一只老鼠,即可找出所有符合要求的老鼠的编号。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct data
{
int w, s;
int i;
};
data num[1005];
int dp[1005];
int d[1005];
int cmp(data a, data b)
{
if(a.w != b.w)
return a.w < b.w;
else
return a.s > b.s;
}
int main()
{
freopen("C:\\Users\\23535\\Desktop\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
freopen("C:\\Users\\23535\\Desktop\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
// freopen("3.txt", "r", stdin);
int n = 1, i, j;
int maxlen = 0, maxindex = -1;
for(i = 0; i < 1005; i++)
dp[i] = 1;
memset(d, 0, sizeof(d));
while(cin >> num[n].w >> num[n].s)
{
num[n].i = n;
n++;
}
dp[1] = 1;
sort(num + 1, num + n, cmp);
for(i = 1; i < n; i++)
{
for(j = 1; j < i; j++)
{
if(num[i].w > num[j].w && num[i].s < num[j].s && dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
d[i] = j;
if(maxlen < dp[i])
{
maxindex = i;
maxlen = dp[i];
}
}
}
}
int ans[1000];
int t = maxindex;
i = 0;
while(t != 0)
{
ans[i++] = num[t].i;
t = d[t];
}
cout<<maxlen<<endl;
// cout << i << endl;
for(j = i - 1; j >= 0; j--)
cout << ans[j] << endl;
fclose(stdin);//关闭重定向输入
fclose(stdout);//关闭重定向输出
return 0;
}