动态规划--最长上升子序列(Longest increasing subsequence)
前面写了最长公共子序列的问题。然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了。其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了。不错不错~加油
题目描述:POJ2533
给出一个数列,找出这个数列中最长上升子序列中所包含的个数。
解题思路:
DP问题解题的一般方法就是自下而上,即先求解小的问题,然后再根据小的问题来解决大的问题,最后得到解。但是这里还要满足的条件是最优子结构,即最优解包含着其子问题的最优解。
那么我们首先用arr[]数组(从0下标开始)存储要求的数列,用longest_num[i]数组来记录以i为结尾的子序列里面包含的最长上升子序列的数字个数。然后用循环控制,从下标为1开始求longest_num,并且记录找到的最大值,即可得到解。在我的程序里面,我还加了一个功能就是把最长上升子序列打印出来,如果存在有多个的话,那么就只打印最后一个。
最后根据下面的DP方程就可以进行求解了:
longest_num[i] = max{longest_num[j] + 1,longest_num[i]} 其中j < i && arr[j] < arr[i]
程序:
#include <stdio.h> #define MAX_N 1001 int arr[MAX_N];
int longest_num[MAX_N];
int bt[MAX_N];
int max_point = ; int LIS(int n)
{ int max = ; //最长上升子序列的个数
int i,j; for (i = ; i < n; i++) //i下标之前(包括i)的最长上升子序列的个数
{
longest_num[i] = ;
} for (i = ; i < n; i++) //用于回溯
{
bt[i] = -;
} for (i = ; i < n; i++)
{
for (j = ; j < i; j++)
{
if (arr[i] > arr[j] && longest_num[i] < longest_num[j] + )
{
longest_num[i] = longest_num[j] + ;
if (longest_num[i] >= max)
{
max = longest_num[i];
max_point = i;
bt[i] = j;
}
}
}
} return max;
} void backtrack(int point)
{
if (- == bt[point])
{
printf("%d ",arr[point]);
return;
}
else
{
backtrack(bt[point]);
printf("%d ",arr[point]);
}
} int main()
{
int n,i,ret;
FILE *fp; fp = fopen("in.txt","r");
if (fp == NULL)
{
printf("fopen error!\n");
return -;
} fscanf(fp,"%d",&n);
for (i = ; i < n; i++)
{
fscanf(fp,"%d",&arr[i]);
} ret = LIS(n);
printf("%d\n",ret); backtrack(max_point);
printf("\n"); return ;
} 2013/8/16 16:21
测试数据:
7
1 7 3 5 9 4 8
测试结果:
动态规划--最长上升子序列(Longest increasing subsequence)的更多相关文章
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n). 具体分析参考:http://b ...
- [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...
- 300最长上升子序列 · Longest Increasing Subsequence
[抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...
- 【转】动态规划:最长递增子序列Longest Increasing Subsequence
转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...
- 最长递增子序列(Longest increasing subsequence)
问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续). 这道题共3种解法. 1. 动态规划 动态规划的核心是状态的定义和状态转移方程.定义lis(i),表示前i个数中以A[ ...
- 算法实践--最长递增子序列(Longest Increasing Subsquence)
什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5 ...
- [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence
We define a harmonious array is an array where the difference between its maximum value and its mini ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...
- 最长公共子序列(Longest common subsequence)
问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列.(子序列中的字符不要求连续) 这道题可以 ...
随机推荐
- spring+mybatis的插件【shardbatis2.0】+mysql+java自定义注解实现分表
一.业务场景分析 只有大表才需要分表,而且这个大表还会有经常需要读的需要,即使经过sql服务器优化和sql调优,查询也会非常慢.例如共享汽车的定位数据表等. 二.实现步骤 1.准备pom依赖 < ...
- 处理 ASP.NET 中的异常:无法在发送 HTTP 标头之后进行重定向。
因为在 Global.asax 中的 Application_Error 事件中添加了统一的错误处理,其中会有 Redirect 重定向到错误页面. 但是有可能有些情况下已经进行过其它重定向操作,所以 ...
- 我的Eclipse设置
1.默认编码改成:UTF-8(在老项目里设置此项可能导致java源码文件注释显示乱码!可以手工输入GBK三个字母,然后点apply) 2.文件默认打开方式 3.背景颜色(#C0C0C0,RGB(192 ...
- IOS 入门开发之创建标题栏UINavigationBar的使用
转自:http://xys289187120.blog.51cto.com/3361352/685746 IOS 入门开发之创建标题栏UINavigationBar的使用 IOS 开发有关界面 ...
- 深入理解Linux内核-进程地址空间
给内核分配内存和给用户态进程分配内存是有区别的:1.内核的优先级最高,如果某个内核函数请求动态内存,不会被延时2.内核信任自己,不必保护措施3.用户态进程对动态内存的请求被认为不是紧迫的,总是被尽量推 ...
- Shell中整数比較
-eq 等于,如:if ["$a" -eq "$b" ] -ne 不等于,如:if ["$a" ...
- socket.io笔记二之事件监听回调函数接收一个客户端的回调函数
//服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...
- 每日英语:A Buying Guide to Air-Pollution Masks
Blue skies were finally visible in the capital on Thursday after the region suffered fromseven strai ...
- 【delphi】多线程同步之Semaphore
另外两种多线程的同步方法 CriticalSection(临界区) 和 Mutex(互斥), 这两种同步方法差不多, 只是作用域不同; CriticalSection(临界区) 类似于只有一个蹲位的公 ...
- 【Android】json格式详解
JSON有两种结构 1. “名称/值”对的集合(A collection of name/value pairs). 不同的语言中,它被理解为对象(object),记录(record),结构(s ...