旅行青蛙
这道题它的中心思想是动态规划中求最长递增的子序列(不连续)。
在示例中我们输入:
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; }加油每一天!