题目96:拦截导弹

http://ac.jobdu.com/problem.php?cid=1040&pid=95

最长递增子序列:

                  f(1)=1;
                  f(i) = max { 1 , f(j)+1 | aj < ai && j < i }      

最长递增不减序列:

                  f(1)=1;
                  f(i) = max { 1 , f(j)+1 | aj >=ai && j < i }   

#include <stdio.h>

int dp[26];             //保存以i结尾的最长递增序列的长度
int list[26];          //保存原始序列 

int max(int a,int b)
{
	return a>b?a:b;
}
int main()
{
	int k,i,j;
	while(scanf("%d",&k)!=EOF)
	{
		for(i=1;i<=k;i++)
		{
			scanf("%d",&list[i]);
		}
        for (i=1;i<=k;i++)
        {
			int tmax=1;
			for (j=1;j<i;j++)
			{
               if (list[j]>=list[i])         //依次从前比较更新数值
               {
				   tmax=max(tmax,dp[j]+1);
               }
			}
			dp[i]=tmax;
        }
		int ans=1;
		for (i=1;i<=k;i++)        //找到最大的递增序列个数
		{
			ans=max(ans,dp[i]);
		}
		printf("%d\n",ans);
	}
	return 0;
}


发布了103 篇原创文章 · 获赞 3 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章