思路:记忆dp,先排序
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
struct node{
int w, s, sum, pre, ini_no;
};
bool cmp(node n1, node n2)
{
if (n1.w != n2.w)
return n1.w < n2.w;
return n1.s > n2.s;
}
vector<int> res;
vector<node> input;
int max_sum, max_final_no;
void dp(int n)
{
sort(input.begin(), input.end(), cmp);
max_sum = 0;
for (int i = 0; i < n; i++)
{
for (int j = i - 1; j >= 0; j--)
{
if (input[j].w < input[i].w&&input[j].s > input[i].s&&input[j].sum +1> input[i].sum)
{
input[i].sum = input[j].sum + 1;
input[i].pre = j;
if (input[i].sum > max_sum)
{
max_sum = input[i].sum;
max_final_no = i;
}
}
}
}
res.clear();
int pre_no = max_final_no;
for (int i = 0; i < max_sum; i++)
{
res.push_back(input[pre_no].ini_no+1);
pre_no = input[pre_no].pre;
}
}
int main()
{
input.clear();
int w, s, n = 0;
while (cin >> w >> s&&w!=-1)
{
input.push_back(node{w,s,1,n,n});
n++;
}
dp(n);
cout << max_sum << endl;
for (int i = max_sum - 1; i >= 0; i--)
cout << res[i] << endl;
cin >> n;
return 0;
}