这题,很明显的动态规划。
按照老鼠的重量从小到大排序,重量一样的,按速度从大到小排序。
然后进行动态规划,dp[i] = dp[j] + 1;(符合条件的)
还有一点比较重要,就是输出的不唯一,样例的 4 4 5 9 7 和 4 4 5 9 8 都是对的。我输出的是4 4 5 9 8
下面的AC的代码:
#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("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 << i << endl;
for(j = i - 1; j >= 0; j--)
cout << ans[j] << endl;
return 0;
}