博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2533: Longest Ordered Subsequence
阅读量:7114 次
发布时间:2019-06-28

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

hot3.png

解题思路:很简单的动规。

设序列长度为 N,每步状态 dp[i] (0 <= i <= n - 1) 为 [0...i] 区间使用 i 所能组成的最长单调递增子序列的长度。

动规条件:

  • 初始状态设 1(因为 a[i] 自身也是 a[0...N] 的子序列,其长度为 1)。
  • 状态转移方程:dp[i] = dp[j] + 1(其中,j < i && a[j] < a[i],且 dp[j] 为满足前述条件之最大者)。

代码:

#include 
const int MAX = 1001;int a[MAX], dp[MAX];void solve(int n) { int ans = 1; for (int i = 0; i < n; ++i) { // 置初值 dp[i] = 1; // 遍历所有满足 j < i && a[j] < a[i] 之条件者, // 并取其最大值 for (int j = i - 1; j >= 0; --j) { if (a[i] > a[j] && dp[j] + 1 > dp[i]) { dp[i] = dp[j] + 1; } } // 同步记录最长序列长度 if (dp[i] > ans) { ans = dp[i]; } } printf("%d\n", ans);}int main() { int n; while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } solve(n); } return 0;}

转载于:https://my.oschina.net/Alexanderzhou/blog/205090

你可能感兴趣的文章
ThinkCMF----调用指定栏目的文章列表
查看>>
还不错的MUI技术文档
查看>>
远程桌面能连接到服务器,但PING不通
查看>>
在 Windows Azure 上设计大型服务的最佳做法
查看>>
C++继承
查看>>
2015.7个人反思小结以及兴许规划
查看>>
云端数据遭觊觎 安全问题不容忽视
查看>>
编译gaia
查看>>
如何识别真Microsoft服务与非Microsoft服务来定位病毒自己的服务
查看>>
大数据之路- Hadoop环境搭建(Linux)
查看>>
解决问题:保存图片到本地文件夹后,在图库里看不到保存的图片问题。
查看>>
Android 源码分析(八) Launcher 桌面启动App过程
查看>>
BFS--POJ 1979
查看>>
day 19
查看>>
HMMPfam的安装使用手记(转载)
查看>>
使用 innotop 监控
查看>>
Android一 流
查看>>
掌阅之语----》记录
查看>>
Linux下ld搜索问题:ld: cannot find -l"XX"
查看>>
C++ 常用的字符串处理函数实现
查看>>