本题有两种解法
解法一是使用递归解法,缺点是运行时间长,有大量重复计算,解法2是动态规划解法
//解法1:递归解法
#include<stdio.h>
#include<string.h>
int num;
int high[200];
int find(int i)
{
int step = 1;
if (i == num - 1) { return 1; }
else
{
for (int j = i + 1; j < num; j++)
{
if (high[j] > high[i])
{
step = (step > (find(j) + 1)) ? step : (find(j) + 1);
}
}
}
return step;
}
int main(void)
{
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
scanf("%d", &high[i]);
}
int max = 1;
for (int i = 0; i < num; i++)
{
max = (max > find(i)) ? max : find(i);
}
printf("%d", max);
return 0;
}
解法2是优化后的动态规划解法,增加了缓存数组,但本质上还是基于递归法
//解法2:动态规划解法
//主旨是定义缓存数组,减少重复计算
#include<stdio.h>
#include<string.h>
int num;
int high[200];
int dp[200]={0};
int find(int i)
{
int step=1;
if(dp[i]!=0){return dp[i];}//如果dp数组中已经缓存了之前存储的数据,则不用再进行计算
if(i==num-1){return 1;}
else
{
for(int j=i+1;j<num;j++)
{
if(high[j]>high[i])
{
step=(step>(find(j)+1))?step:(find(j)+1);
dp[i]=step;
}
}
}
return step;
}
int main(void)
{
scanf("%d",&num);
for(int i=0;i<num;i++)
{
scanf("%d",&high[i]);
}
int max=1;
for(int i=0;i<num;i++)
{
max=(max>find(i))?max:find(i);
}
printf("%d",max);
return 0;
}
解法3是利用迭代法的动态规划方法,运行时间大量减少
//解法2:动态规划解法
//主旨是定义缓存数组,减少重复计算
#include<stdio.h>
#include<string.h>
int num;
int high[200];
int dp[200] = { 0 };
int main(void)
{
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
scanf("%d", &high[i]);
}
//倒着遍历
for (int i = 0; i < num; i++) { dp[i] = 1; }
for (int i = num - 1; i >= 0; i--)
{
for (int j = i + 1; j < num; j++)
{
if (high[j] > high[i])
{
dp[i] = (dp[i] > dp[j] + 1) ? dp[i] : dp[j] + 1;
}
}
}
int max = 1;
for (int i = 0; i < num; i++)
{
max = (max > dp[i]) ? max : dp[i];
}
printf("%d", max);
return 0;
}

京公网安备 11010502036488号