《最长非降子序列》 动态规划算法入门
来源:互联网 发布:淘宝店铺装修设计 编辑:程序博客网 时间:2024/05/29 10:50
题目描述
一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列的长度
思路分析
这是博客http://hawstein.com/posts/dp-novice-to-advanced.html 上的第二个例子
编写代码
递归的代码看起啦更加好理解一些,不过用循环的方法代码更加简洁
使用递归的方法
show you code:
#include <iostream>using namespace std;int dp[6];int max(int a,int b){return (a>b)? a:b;}int dp_fun(int *A,int i,int num){if(i == 0){dp[i] = 1;return max(dp[i],dp_fun(A,i+1,num));}else{dp[i] = 1;for(int j=0;j<i;j++){if(A[j]<A[i] && dp[j]+1>dp[i])dp[i] = dp[j]+1;}if(i == num) return dp[i];else return max(dp[i],dp_fun(A,i+1,num));}}int main(){ int A[] = { 5, 3, 4, 8, 6, 7 }; cout<<dp_fun(A,0,6)<<endl; for(int i=0;i<6;i++)cout<<dp[i]<<" "; return 0;}
使用循环的方法
show you code:
#include <iostream>using namespace std;int lis(int A[], int n){ int *d = new int[n]; int len = 1; for(int i=0; i<n; ++i){ d[i] = 1; for(int j=0; j<i; ++j) if(A[j]<=A[i] && d[j]+1>d[i]) d[i] = d[j] + 1; if(d[i]>len) len = d[i]; } delete[] d; return len;}int main(){ int A[] = { 5, 3, 4, 8, 6, 7 }; cout<<lis(A, 6)<<endl; return 0;}
0 0
- 《最长非降子序列》 动态规划算法入门
- 动态规划-最长非降子序列
- 动态规划-最长非降子序列
- 动态规划 最长非降子序列
- 【算法】动态规划 最长上升子序列
- 【算法】 动态规划 最长公共子序列
- 动态规划算法----实现最长子序列
- 动态规划2:最长非升子序列和最长非降子序列
- 动态规划之最长非降子序列
- 动态规划——最长非降子序列
- 最长非降子序列 动态规划 java
- 算法导论--动态规划算法--求最长回文序列
- 动态规划入门之最长公共子序列(LCS)
- 动态规划入门策略—“最长公共子序列”
- 51nod动态规划入门--最长公共子序列
- 动态规划入门 COGS1398 最长上升子序列
- 动态规划实现最长公共子序列(LCS)算法
- 最长单调子序列LIS的简单动态规划算法
- Centos6.5编译安装GCC4.9
- C++中的数组指针
- SAS:SAS 常用过程之 统计描述过程proc means
- Android SDK r14离线安装包
- 基于lucene.net 和ICTCLAS2014的站内搜索的实现1
- 《最长非降子序列》 动态规划算法入门
- Oracle : buffer busy wait
- 百度之星初赛第二轮第一题超时代码(可能还有错误)
- #if defined和#if !defined
- ser文件与Java对象序列化
- android开源项目下载代码的方法
- 设计模式的分类
- C语言中的time函数
- matlab实现的手写体字符截取字符区域的方法