題目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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章