Difficulty: middle
Algorithms: Dynamic Programming
Description: 题目的要求是让大象的体重从小到大排,而智力从大到小排,输出这样的最长的路径,并打印路径。首先先对体重从大到小排序,然后再依照智力找最长的路径,实际上就变成了最长上升子序列,经典的动态规划
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int d[1010];
struct Node{
int weight;
int iq;
int num;
};
Node node[1010];
int cmp(Node a, Node b)
{
if(a.weight == b.weight)
return a.iq < b.iq;
else return a.weight > b.weight;
}
int dp(int i)
{
if(d[i] != -1)
return d[i];
d[i] = 1;
int temp;
for(int j = 0; j < i; j++){
if(node[j].iq < node[i].iq && node[j].weight > node[i].weight){
temp = dp(j) + 1;
if(d[i] < temp){
d[i] = temp;
}
}
}
return d[i];
}
int main()
{
int i, j, k;
int n = 0;
//freopen("input.txt", "r", stdin);
while(cin>>node[n].weight>>node[n].iq){
n++;
node[n - 1].num = n;
}
sort(node, node + n, cmp);
memset(d, -1, sizeof(d));
j = 0;
for(i = 0; i < n; i++){
if(j < dp(i)){
j = d[i];
k = i;
}
}
cout<<j<<endl;
for(k; k >= 0; k--){
if(d[k] == j){
cout<<node[k].num<<endl;
j--;
}
}
return 0;
}