/*
hdu1160 FatMouse'Speed
肥老鼠跑得慢
算法分类:
动态规划基础问题
算法思路:
共输入N组数据,那么我们设输入第i组数时,此时的最大子序列中数据的个数f(i)应该是:
f(i)=max{f(j)|1<=j<i AND mouse[i].weight>mouse[j].weight AND mouse[i].speed<mouse[j].speed}+1;
这个式子的意思就是包含第i项的前i组数据中的最大子序列中元素的个数。
而我们要求的是这个{f(i)|1<=i<=N}中的最大值并求出这个最大值时的各个元素的下标。
*/
#include<stdio.h> #include<string.h> typedef struct mouse { int w; //weight int s; //speed int i; //在原数组中的下标 }mouse; mouse m[1002]; //至多1000组数据 typedef struct list { int sub[1002]; //定义子序列下标数组映射m int count; //定义子序列中元素个数 }list; list l[1002]; void f(int i) { mouse M=m[i]; int max=0,j,li=0,temp; //li表示最大组在list中的下标 for(j=0;j<i;j++) { temp=l[j].sub[l[j].count-1]; if(l[j].count>max&&m[temp].w<M.w&&m[temp].s>M.s) { max=l[j].count; li=j; } } max++; l[i].count=max; for(j=0;j<l[i].count-1;j++) { l[i].sub[j]=l[li].sub[j]; } l[i].sub[max-1]=i; } int main() { int n=0,i,j,max=0,q; mouse temp; memset(l,0,sizeof(l)); //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); while(scanf("%d %d",&m[n].w,&m[n].s)!=EOF) { m[n].i=n; n++; //将数据存入m数组中,l为输入数据的总数; } for(i=0;i<n;i++) //按weight升序排序; { for(j=i+1;j<n;j++) { if(m[i].w>m[j].w) { temp=m[j]; m[j]=m[i]; m[i]=temp; } } } for(i=0;i<n;i++) { f(i); if(l[i].count>max) { max=l[i].count; q=i; } } printf("%d\n",l[q].count); for(i=0;i<l[q].count;i++) { printf("%d\n",m[l[q].sub[i]].i+1); } }