#include<iostream> #include<stdio.h> using namespace std; int a[1001][2]; int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&a[i][0]); a[i][1]=1; } for(i=1;i<n;i++) { int max=0; for(j=i-1;j>=0;j--) if(a[j][0]<a[i][0]) { if(max<a[j][1]) max=a[j][1];//最后一个错误 必须找到j 前面最大的a[j][1] 和a[i][1]相加 } a[i][1]+=max; } int max=0; for(i=0;i<n;i++){if(a[i][1]>max) max=a[i][1];}//找出最大的输出 printf("%d/n",max); } return 0; } http://poj.grids.cn/problem/2757/ 思路: 找到子问题 ; 子问题:以每一个元素为终点计算前面有多少个比该元素小的数 一层一层的累加上去