经典例题:PKU 1887 Testing the CATCHER
http://acm.pku.edu.cn/JudgeOnline/problem?id=1887
解题思路:创建一个一维数组num_array[j],max_array[],num_array[j]表示序列的元素,max_array[i]表示以第i个元素结尾的序列中的最长下降子序列,初始化为0,对于一个max_array[i],遍历前面的每个元素j,如果num_array[j]> num_array[i]且max_array[j]>= max_array[i],那么max_array[j]就要加1,所以递推公式为:
if(num_array[i]<=num_array[j]&&max_array[i]<=max_array[j]) max_array[i]++;
最后选最大的一个max_array[i]就是最长下降子序列的个数。
i = 1;
while (scanf("%d",&a[i]))
{
if (a[i] == -1)
{
break;
}
i++;
}
//----------------------------------------------
int len = i;
int maxnum = -1;
for (i=0;i<=len;i++)
maxa[i] = 0;
for (i=1;i<=len;i++)
{
for (j=0;j<i;j++)
{
if (a[i]<=a[j] && maxa[i]<=maxa[j]) //理解这句 maxa[i]<=maxa[j]
{
maxa[i]++;
}
}
maxnum = maxnum>maxa[i]?maxnum:maxa[i];
}
printf("Test #%d:/n maximum possible interceptions: %d/n/n",cnt,maxnum);
}
return 0;
}