动态规划之最长上升子序列
来源:互联网 发布:哔哩哔哩动画mac 版 编辑:程序博客网 时间:2024/04/30 07:40
O(n^2)就不介绍了。
稍微讲一下O(nlog(n))的。
#include <iostream> using namespace std; int main(void) { int i,j,n,a[100],b[100],max; while(cin>>n) { for(i=0;i<n;i++) cin>>a[i]; b[0]=1; //初始化,以a[0]结尾的最长递增子序列长度为1 for(i=1;i<n;i++) { b[i]=1; //b[i]最小值为1 for(j=0;j<i;j++) if(a[i]>a[j]&&b[j]+1>b[i]) b[i]=b[j]+1; } for(max=i=0;i<n;i++)//求出整个数列的最长递增子序列的长度 if(b[i]>max) max=b[i]; cout<<max<<endl; } return 0; }
代码关键部分n^2:
for (int i = 1 ; i <= n; i ++){ for (int j = 1; j < i; j ++){ if (a[i] < a[j]){ maxlen[i] = max(maxlen[i], maxlen[j]+1); //用滚动数组,maxlen[i]表示取a[i]时最长的长度。 } } } <span style="font-family: Arial, Helvetica, sans-serif;"> </span>1.1求上升子序列的串数。
其实就是反过来求下降子序列的最长长度。
代码略。
1.2求不重复的某个长度序列的种数。
这个稍微有些难度。
由于每个maxlen[i]都是由maxlen[j]转换而来的,当a[i]=a[j]时,就不用加了。会重复。
poj1952
#include <iostream> #include <string.h> using namespace std; const int size = 5100; int maxlen[size];//记录当前第1个点到第i个点之间的最长下降序列长度 int maxnum[size];//记录1~i之间的最长下降序列个数 int main() { int a[size]; int n; while (scanf("%d", &n) != EOF){ for (int i = 1; i <= n; i ++){ scanf("%d", &a[i]); maxnum[i] = 0; maxlen[i] = 1; } for (int i = 1 ; i <= n; i ++){ for (int j = 1; j < i; j ++){ if (a[i] < a[j]){ maxlen[i] = max(maxlen[i], maxlen[j]+1); } } } for (int i = 1; i <= n; i ++) if (maxlen[i] == 1)maxnum[i] = 1; for (int i = 2; i <= n; i ++){ int sum = 0; bool check = false; for (int j = i-1; j > 0; j --){ if (a[j] > a[i]){ if (maxlen[j]+1 == maxlen[i]){ maxnum[i] += maxnum[j]; } } if (a[j] == a[i]){ if (maxlen[i] == 1)maxnum[i] = 0;//如果搜索到一个相同的数后仍没有找到符合要求的序列,则为了避免重复赋值为0 break; } } } int maxx = -1; for (int i = 1; i <= n; i ++){ if (maxlen[i] > maxx) maxx = maxlen[i]; } int ans = 0; for (int i = 1; i <= n; i ++){ if (maxlen[i] == maxx) ans += maxnum[i] ; } printf("%d %d\n", maxx, ans); } return 0; }
0 0
- 动态规划之最长上升子序列
- 【动态规划】 之 最长上升子序列
- poj 1836 (动态规划之最长上升子序列)
- 动态规划(DP)之最长上升子序列
- 动态规划学习之最长上升子序列
- 动态规划(DP)之最长上升子序列问题
- 简单动态规划之最长上升子序列
- 经典动态规划之最长上升子序列
- C++动态规划算法之最长上升子序列
- 动态规划专题之最长上升子序列
- 算法学习之动态规划--最长上升子序列
- 动态规划:最长上升子序列
- 动态规划-最长上升子序列LIS
- 动态规划求最长上升子序列
- 【算法】动态规划 最长上升子序列
- 动态规划:最长上升子序列
- poj2533 动态规划+最长上升子序列
- POJ2533 动态规划 (最长上升子序列)
- 观察者模式
- OC中类的封装
- 做一款属于自己的体感游戏
- VMware网络连接方式(Host-only、NAT、Bridged)介绍及NAT环境下静态IP配置
- iOS-UIResponse之事件响应链及其事件传递
- 动态规划之最长上升子序列
- ACM学习-动态规划-物品供应问题
- 【Linux导论】查找Linux文档(Finding Linux Documentation)
- Ubuntu 出现apt-get: Package has no installation candidate问题
- iOS开发如何让透明View里的对象不透明
- windwos 2008 R2 hype-v
- 初学Collection之三
- 笔试题引发的思考--引用传递
- VCL+FMX 双剑合壁编程