#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,x,m,dp[1005];
while(scanf("%d",&n)!=EOF&&n)
{
memset(dp,0,sizeof(dp));
m=0; //m代表最长递减序列个数
//dp[i]代表第i个最长递减序列中当前状态的所含元素最小值
for(i=1;i<=n;i++)
{
scanf("%d",&x);
//将当前状态值与之前阶段值对比
for(j=1;j<=m;j++)
{
//如果比某个历史阶段的值小,则覆盖,读取下一状态值
if(x<=dp[j])
{
dp[j]=x;
break;
}
}
//如果当前状态值比之前阶段值都大,则新增序列
//新增的序列最小元素值为当前状态值
if(j>m)
dp[++m]=x;
}
printf("%d\n",m);
}
return 0;
}
1257hdu1257 最少拦截系统
最新推荐文章于 2021-03-09 21:06:25 发布
本文介绍了一个通过动态规划解决最长递减子序列问题的C语言实现。该算法使用了一个数组来存储递减子序列的状态,能够高效地找出给定序列中最长递减子序列的长度。
274

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



