标签:main strong ref 依次 i++ 输出 params 考试题 .com
题目链接:http://cxsjsxmooc.openjudge.cn/2017t2summerw5/3/
8 300 207 155 300 299 170 158 65
6
算法分析:
这个题目其实跟最长上升子序列问题类似,只是这里寻找的是最长不上升子序列的长度。
假设用maxLen[k]表示以a[k]做为“终点”的最长不下降子序列的长度,那么:
初始状态: maxLen [1] = 1
maxLen[k]= max { maxLen [i]: 1<=i < k 且 a[i ]>= a[k]且 k≠1 } + 1
若找不到这样的i,则maxLen[k] = 1
maxLen[k]的值,就是在a[k]左边,“终点”数值大于或等于a[k] ,且长度最大的那个不上升子序列的长度再加1。因为a[k]左边任何“终点”大于或等于a[k]的子序列,加上a[k]后就能形成一个更长的不上升子序列 。
1 #include <stdio.h> 2 #define maxN 5005 3 int main(int argc, char *argv[]) 4 { 5 int i,j; 6 int n,a[maxN],maxLen[maxN];//maxLen[k]表示以a[k]做为“终点”的最长不上升子序列的长度 7 int max; 8 9 scanf("%d",&n); 10 for(i=0;i<n;i++) { scanf("%d",&a[i]); maxLen[i]=1; } 11 12 for(i=1;i<n;i++)//枚举所有子序列的终点 13 { 14 for(j=0;j<i;j++)//枚举以a[i]做终点的子序列中a[i]的前缀元素 15 { 16 if(a[j]>=a[i])//尝试用a[j]做a[i]的直接前缀形成新的子序列 17 { 18 maxLen[i]=(maxLen[j]+1>maxLen[i]?maxLen[j]+1:maxLen[i]); 19 } 20 } 21 } 22 max=maxLen[0]; 23 for(i=1;i<n;i++) 24 if(maxLen[i]>max) max=maxLen[i]; 25 printf("%d\n",max); 26 return 0; 27 }
注意:不要想着把数组翻转过来然后寻找最长上升子序列哈哈哈,题目说了,不能够先拦截后面的导弹。
标签:main strong ref 依次 i++ 输出 params 考试题 .com
原文地址:http://www.cnblogs.com/huashanqingzhu/p/7348114.html