zoj 1108 FatMouse's speed

fatmouse就是我们可爱的老师wk,估计是某位同学为他写的题目。题目给出了一系列的老鼠。每只老鼠有重量和速度的数据,最后需要找出一个重量严格递增而速度严格递减的老鼠序列。

方法比较简单:首先按照重量排序,然后之间DP找最长的速度递减序列,唯一需要注意的地方是排序时的次要关键属性(速度)需要按照递增来排列,这样可以做到严格递增。应为会出现重量、速度或者两者都相同的老鼠。

代码如下:

#include<stdio.h> #include<stdlib.h> int cmp(void const *a, void const *b) { int *c = (int *)a; int *d = (int *)b; if(c[0] == d[0]) return c[1] - d[1]; else return c[0] - d[0]; } int main() { int s[1010][3]; int i=0; while(scanf("%d %d",&s[i][0],&s[i][1])!=EOF) { i++; s[i][2] = i+1; } qsort(s,i,sizeof(s[0]),cmp); int t[1010]; int pre[1010]; t[0] = 1; pre[0] = -1; for(int j=1;j<i;j++){ t[j] = 1; pre[j] = -1; for(int k=j-1;k>=0;k--){ if(s[k][1] >s[j][1]&&t[j] < t[k]+1) { t[j] = t[k]+1; pre[j] = k; } } } int max = 0; int maxtag = 0; for(int l=1;l<i;l++){ if(max<t[l]) { max = t[l]; maxtag = l; } } printf("%d/n",max); int tag = maxtag; int ans[1010]; int a=0; while(pre[tag]!=-1){ ans[a++] = s[tag][2]; tag = pre[tag]; } ans[a] = s[tag][2]; for(int m=a;m>=0;m--) printf("%d/n",ans[m]); }

你可能感兴趣的:(c)