题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25
解题报告:
#include <cstdio> #include <algorithm> #include <cstring> #define MAXN 5005 using namespace std; struct stick { int l;///木棒的长度 int w;///木棒的重量 } data[MAXN]; int cmp(stick a,stick b) { ///长度优先 if(a.l==b.l) return a.w<b.w; else return a.l<b.l; } int DP(int n,stick a[]) { ///数组b[]表示木棒的分组的序号 int b[MAXN]; memset(b,0,sizeof(b)); int i,j,k; b[0]=1; for(i=1;i<n;i++) { ///计算第i个木棒的分组序号 k=0; for(j=0;j<i;j++) { if(a[i].w<a[j].w&&k<b[j]) k=b[j]; } b[i]=k+1; } int _max=0; for(int i=0;i<n;i++) { if(_max<b[i]) _max=b[i]; } return _max; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d%d",&data[i].l,&data[i].w); } sort(data,data+n,cmp); printf("%d ",DP(n,data)); } return 0; }