这是一道极好的题,会了这个应该说 最长递增子序列什么的 就有了另外一种思路了
下面附上代码---应该仔细的看一下 那个 if判断
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int a[1000],d[1000]; 5 int main() 6 { 7 int N,i,j,maxn; 8 while(scanf("%d",&N)!=EOF) 9 { 10 for(i=1;i<=N;i++) 11 { 12 scanf("%d",&a[i]); // 13 d[i]=1; // 假设 一个 导弹 可以解决 所有的 14 } 15 for(i=2;i<=N;i++) // 一个一个导弹 向下传送 16 { 17 for(j=1;j<i;j++) // 将这个导弹之前的 导弹全部 遍历一遍 18 { 19 if(a[i]>a[j]&&d[i]<d[j]+1) // 如果 现在的导弹的 高度 比 第 j 个导弹的 高度 要高 如果这一个导弹的 飞行高度 奇高 比之前的所有导弹的 高度都高 20 // 那么这个 导弹 也只需要一个 拦截系统即可 在刚才买的 防御系统之上再加一个 防御系统就好了不能 看到上一个拦不住 就再买看到下一个也拦不住 就又买 21 d[i]=d[j]+1; // 在原来的基础之上 再买一个 22 } 23 } 24 maxn=-1; 25 for(i=1;i<=N;i++) 26 { 27 maxn=max(maxn,d[i]); 28 } 29 printf("%d ",maxn); 30 } 31 }