水dp啊。
一维数组搞定。 先排序。 weigh 从小到大 如果相同 speed 从大到小
然后扫一遍就好了。 对于某一个位置 找出他之前的最大的位置就好。 d【】 要初始化为1
这个题要打印路径。 也简单。 对于任意一个位置。 只要找出 前面 数量最多的那个位置 用 fa【】 数组 记录一下就好。
以前最害怕打印路径的题了。 现在好多了。。
更新: 自己做完之后又去看了一下别人的做法。 简直弱爆了。 这个题还可以 按照 weigh 从小到大排序之后 求 speed 的最大下降子序列。。
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAXN 1000+10
struct Mice{
int we;
int sp;
int id;
friend bool operator < (Mice a, Mice b){
if(a.we != b.we)
return a.we < b.we;
else
return a.sp > b.sp;
}
};
int d[MAXN] = {0};
int f[MAXN] = {0};
Mice s[MAXN];
void dfs(int i){
if(!f[i]){
return ;
}
else{
dfs(f[i]);
printf("%d\n",s[f[i]].id);
}
}
int main (){
int x,y;
int k = 1;
memset(s,0,sizeof(s));
while(scanf("%d%d",&s[k].we,&s[k].sp) != EOF){
s[k].id = k,k++;
}
sort(s+1,s+k);
int M = 0;
for(int i = 0; i < k; i++)
d[i] = 1;
memset(f,0,sizeof(f));
for(int i = 1; i < k; i++){
for(int j = 1; j < i; j++){
if(s[j].we < s[i].we && s[j].sp > s[i].sp){
if(d[j]+1 > d[i]){
d[i] = d[j]+1;
f[i] = j;
}
}
}
}
int wh = 0;
for(int i = 1; i < k; i++){
if(d[i] > M){
wh = i;
M = d[i];
}
}
printf("%d\n",M);
dfs(wh);
printf("%d\n",s[wh].id);
return 0;
}