javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2019-11-03 06:36:23 | 查看: 84 | 回复: 0

一、问题:a[]={2,1,5,3,6,4,8,9,7}最长是5(1,3,4,8,9)二、问题分析:dp数组设一维,因为只有一个数组。dp数组存的是前j项最大递增子序列的个数。如果当前比前面的数大,那就前面的个数+1。(前面的意思是,当前这个数前面所有。)三、状态转移方程:

dp[i]=max(dp[i],dp[j]+1)

其中:i是当前数字,j是从0开始到i处。四、代码

#include<stdio.h>#definemax(x,y)(x)>(y)?(x):(y)inta[]={2,1,5,3,6,4,8,9,7};intn=sizeof(a)/sizeof(a[0]);intdp[101];intres=0;//答案voidsolve(){for(inti=0;i<n;i++){dp[i]=1;//单个数,自己递增,所以初始化为1for(intj=0;j<i;j++){if(a[i]>a[j])//如果比前面的大dp[i]=max(dp[i],dp[j]+1);//当前的个数和之前个数+1求最大值res=max(res,dp[i]);}}printf("%d\n",res);}intmain(){solve();return0;}

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017