旅行青蛙
这道题它的中心思想是动态规划中求最长递增的子序列(不连续)。
在示例中我们输入:
3
18
7
14
10
12
23
30
16
24
3
18
7
14
10
12
23
30
16
24
输出得到的答案是 6 (是3->7->10->12->16->24这么的一个过程)
我们定义两个数组,一个用于存输入数组,一个用于存动态变化的序列长度。
在初始时,我们默认以3 18 7 14 10 12 23 30 16 24结束的子序列的长度均为1
dp[i]=1;
接下来我们使用两个for循环开始进行对a数组遍历,外层循环从0~n,内层循环从i+1~n开始遍历(实际上是遍历是外层当前元素的后一个元素)
若是遇到后一个元素大于等于前一个元素那么对dp[j]进行更新,m用于得出dp[j]中哪个元素(子序列)更大。最后输出m的值。
核心代码:
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[j]>=a[i]){
dp[j]=max(dp[j],dp[i]+1);
m=max(m,dp[j]);
}
}
}
(ps:本人是个小菜鸡还停留在C的阶段,这里的max函数要在头文件后面补上)
#define max(a,b) a>b?a:b如果是C++的话直接调用max函数就好了,可惜我不会
以下是全部代码:
#include <stdio.h>
#define max(a,b) a>b?a:b
int main()
{
int n, m=1,a[30000], dp[30000];
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
dp[i]=1;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[j]>=a[i]){
dp[j]=max(dp[j],dp[i]+1);
m=max(m,dp[j]);
}
}
}
printf("%d\n",m);
return 0;
}
加油每一天!

京公网安备 11010502036488号