//思路就是用d[i]来记录a[i]为结尾的子序列中最大递增子序列的长度,
//对于每一个i,令j从1到i - 1遍历,当a[j] < a[i],比较当前d[i]和每一个d[j] + 1的大小,将最大值赋给d[i]
int maxarray()//返回最长递增子序列
{
int a[9]={2,1,5,3,6,4,8,9,7};//13489
int dp[9]={0,};
int i,j,max;
int recored[9]={0,};
for(i=0;i<9;i++)
{
dp[i] = 1;//一开始都为1
for(j=0;j<i;j++)
{
if(a[j] < a[i])
{
dp[i] = maxValue(dp[i],dp[j]+1);
}
}
}
//112233454
//找到最大长度的数组下标
int point = 0;
max = dp[0];
for(i=1;i<9;i++)
{
if(dp[i]>=max)
{
max = dp[i];
point ++;
}
}
j=max;
recored[--j] = a[point];
for(i=point;i>=0;i--)
{
if(a[i]<a[point] && dp[i] == dp[point]-1)
{
recored[--j]= a[i];
point =i;
}
}
printf("\r\n");
for(i=0;i<max;i++)
{
printf("%d ",recored[i]);
}
return 0;
}
//dp[i]既然是存放的是以a[i]为尾节点的最大递增子序列,所以假如在dp[i]的后边还存在一个比a[i]大的数,则相应的位置的dp[i]应该再加1
//也就是为什么if(a[j] < a[i]) dp[i] = maxValue(dp[i],dp[j]+1)存在的原因。现在是从前往后进行进行递归的运算。
dp int[9] 0x1AEAEF64
dp[0] int 1
dp[1] int 1
dp[2] int 2
dp[3] int 2
dp[4] int 3
dp[5] int 3
dp[6] int 4
dp[7] int 5
dp[8] int 4
最大递增子序列
猜你喜欢
转载自blog.csdn.net/caogenwangbaoqiang/article/details/80777160
今日推荐
周排行