类似最长连续(不紧靠)子串,方法有两种
参考http://blog.csdn.net/chaoojie/article/details/7919062
先按照体重从小到大排序,再按照速度求最长子串
#include "stdio.h"
typedef struct _Fat{
int w, s;
int p;
}Fat, *pFat;
Fat mice[1001];
int n;
int dp[1001], pre[1001];
void qsort(int s, int e){
int st, ed;
Fat t;
if(s>=e) return;
st = s; ed = e;
t = mice[s];
while(st<ed){
while(st<ed && mice[ed].w>=t.w) ed--;
mice[st] = mice[ed];
while(st<ed && mice[st].w<=t.w) st++;
mice[ed] = mice[st];
}
mice[st] = t;
qsort(s, st-1);
qsort(st+1, e);
}
void show(int p){
if(p==-1) return;
show(pre[p]);
printf("%d\n", mice[p].p);
}
int main(){
int i, j, k, p;
freopen("in.txt", "r", stdin);
n = 0;
while(scanf("%d %d", &(mice[n].w), &(mice[n].s))!=EOF){
mice[n].p = n+1;
n++;
}
qsort(0, n-1);
dp[0] = 1; pre[0] = -1; k = 1; p = 0;
for(i=1; i<n; i++){
dp[i] = 1; pre[i] = -1;
for(j=i-1; j>=0; j--){
if(mice[i].w>mice[j].w && mice[i].s<mice[j].s && dp[i]<dp[j]+1){
dp[i] = dp[j] + 1;
pre[i] = j;
if(dp[i]>k){
k = dp[i];
p = i;
}
}
}
}
printf("%d\n", k);
show(p);
return 0;
}