热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

最长上升子序列问题的变种解法

本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。

题目

题目链接

本题为NOIP2004提高组的题。

在最长上升子序列问题中,朴素做法(这道题数据范围较小朴素算法也能过)中记录的是f[i]中的i是最大值的位置,这道题可以记录拐点的位置,左右分别为LIS问题,一个从左往右,一个从右往左。


代码

#include
#include
#include
#include
using namespace std;
const int N = 110;
int n;
int a[N];
int f[N], g[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++)
{
f[i] = 1;
for (int j = 1; j if (a[j] f[i] = max(f[i], f[j] + 1);
}
for (int i = n; i >= 1; i--)
{
g[i] = 1;
for (int j = n; j > i; j--)
if (a[j] g[i] = max(g[i], g[j] + 1);
}
int ans = 0;
for (int i = 1; i <= n; i++)
ans = max(ans, f[i] + g[i] - 1);
cout < return 0;
}


推荐阅读
author-avatar
光陆光陆光陆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有