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;
}