最长上升子序列长度及其个数
2016-05-04 13:00
183 查看
求最长上升子序列长度的两种方法:
给定一个序列要求最长上升子序列的长度以及满足该长度的子序列个数
done!
int a[MAXN]; int dp[MAXN]; int lis = 0; for (int i = 0; i < n; i++) { dp[i] = 1; for (int j = 0; j < i; j++) { if (a[j] < a[i]) dp[i] = max(dp[i], dp[j] + 1); } lis = max(lis, dp[i]); }
int a[MAXN]; int dp[MAXN]; int lis = 0; for (int i = 0; i < n; i++) { *lower_bound(dp, dp + n, a[i]) = a[i]; } lis = lower_bound(dp, dp + n, INF) - dp;
给定一个序列要求最长上升子序列的长度以及满足该长度的子序列个数
#include <cstdio> #include <algorithm> using namespace std; const int MAXN = 1000; typedef pair<int, int> P; int a[MAXN]; P dp[MAXN]; //dp[i].first表示以a[i]结尾的最长上升子序列长度,dp[i].second表示满足该长度的子序列个数 int main() { //输入序列 int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } int lis = 0; for (int i = 0; i < n; i++) { dp[i].first = 1; for (int j = 0; j < i; j++) { if (a[j] < a[i]) { dp[i].first = max(dp[i].first, dp[j].first + 1); } } //满足最长上升子序列长度的序列个数为长度为dp[i].first-1且a[j]<a[i]的个数 //即将a[i]填入长度为dp[i].first-1的序列末尾 for (int j = i - 1; j >= 0; j--) { if (dp[j].first == dp[i].first - 1 && a[j] < a[i]) { dp[i].second++; } } lis = max(lis, dp[i].first); } printf("%d\n", lis); int ans = 0; for (int i = 0; i < n; i++) { if (dp[i].first == lis) { ans += dp[i].second; } } printf("%d\n", ans); return 0; }
done!
相关文章推荐
- 自定义日志文件写日志
- 进程调度2
- IOS全屏左侧滑(系统方法)
- C++实现简单的扫雷游戏(控制台版)
- 第一天
- dijkstra--求最短路--要判重边,否则wr
- MySQL Workbench的使用
- MVC+EF 理解和实现仓储模式和工作单元模式
- 【Arduino官方教程第一辑】示例程序 2-9 制作你的特雷门琴
- (译文)MVC通用仓储类
- Unity中实现List类型的自定义GUI(ReorderableList)
- Linux的电源管理架构
- Java SubList的使用陷阱
- java并发编程(9)--深入剖析ThreadLocal
- 连接 Postgresql 终于到的问题。
- 各组意见
- 万网云解析设置二级域名解析到同IP不同端口
- LCD
- 浅析.Net下的AppDomain编程
- 2016年4月全球浏览器份额:Chrome打败IE夺冠