博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3903(dp,最长上升子序列,最基础题)
阅读量:4047 次
发布时间:2019-05-25

本文共 1223 字,大约阅读时间需要 4 分钟。

最长上升子序列问题:

定义dp[i]:以 a[i]为末尾的 最长上升子序列 的长度。

递推关系:

dp[i]=max{1,dp[j]+1} 当 i>j且a[i]>a[j]时

边界控制:

d[i]=1;

#include
#include
#include
#include
using namespace std;int dp[100010];int a[100010];int main(){ int N; while (scanf("%d",&N)!=EOF) { int ans = 0; for (int i = 0; i < N; i++) scanf("%d", &a[i]); for (int i = 0; i < N; i++) { dp[i] = 1; for (int j = 0; j < i; j++) if (a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1); ans = max(ans, dp[i]); } printf("%d\n", ans); }}

优化:

dp[i]:长度为i+1(数组从0存放)的 上升子序列中 末尾元素的最小值,不存在的话就是INF;

边界控制:dp[i]=INF;

dp[i]=min(dp[i],a[j]) i=0或者dp[i-1]

#include
#include
#include
#include
#define INF 0x3f3f3f3fusing namespace std;int dp[100010];int a[100010];int main(){ int N; while (scanf("%d", &N) != EOF) { int ans = 0; for (int i = 0; i < N; i++) scanf("%d", &a[i]); fill(dp, dp + N, INF); for (int i = 0; i < N; i++) *lower_bound(dp, dp + N, a[i]) = a[i]; printf("%d\n", lower_bound(dp,dp+N,INF)-dp); }}

转载地址:http://mkyci.baihongyu.com/

你可能感兴趣的文章
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
一文看清HBase的使用场景
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>