题目如图。
#include<stdio.h>
#include<string.h>
int a[1000];
int d[1000];
int main()
{
int n;
while( ~scanf("%d",&n) )
{
int i, j, k, t, q;
int mlc,max;
for(i=0;i<=n;i++)
d[i]=1;
for(i=0; i<n; i++)
scanf("%d",&a[i]);
for(i=n-2; i>=0; i--)
for(j=i+1;j<n;j++)
if(a[i]>=a[j])
{
q=0;
for(k=j+1;k<n;k++)
{
if(d[j]<d[k]&&a[i]>a[k])
{q++;}
}
if(q==0)
{
d[i]=d[i]+d[j];
break;
}
}
mlc=0;
for(i=0;i<n;i++)
if(d[i]>d[mlc])
mlc=i;
printf("%d\r\n",d[mlc]);
}
return 0;
}
解题代码。
这个代码的想法是。
将一次的导弹数字放入数组,定义一个对应属性,值为1,代表它自己是一颗导弹。从最后开始,找到它后面第一个 比它小并且其属性最大的值 相加,最后找到属性最大的数字就是答案。
本文介绍了一个针对导弹序列问题的算法实现。通过分析导弹间的大小关系,利用动态规划思想求解最长递减子序列的变种问题。代码实现了从后向前遍历数组,寻找符合条件的导弹并更新其属性值,最终找出属性值最大的导弹即为最优解。
9866

被折叠的 条评论
为什么被折叠?



