最长单调递增子序列问题(动态规划)o()
// 最长单调递增子序列.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#define N 100
using namespace std;
//递归打印最长递增子序列
void print_it(char *str,int *pre,int last)
{
if(last==-1)
return;
else
{
print_it(str,pre,pre[last]);
cout<<str[last];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//存储原字符串
char str[N];
//len[j]存储到str[j]为止的最长递增子序列长度
int len[N];
//pre[j]存储到str[j]为止的最长递增子序列的前一个字符的位置
int pre[N];
int cases;
cout<<"请输入案例个数:"<<endl;
cin>>cases;
while(cases--)
{
cout<<"请输入字符串:"<<endl;
cin>>str;
//初始化各变量
int i;
int length = strlen(str);
for(i=0;i<length;i++)
{
len[i] = 1;
pre[i] = -1;
}
int j;
int max = 0;
for(j=1;j<length;j++)
{
for(i=0;i<j;i++)
{
max = 0;
if(str[j]>str[i])
{
max = len[i]+1;
if(max>len[j])
{
len[j] = max;
pre[j] = i;
}
}
}
}
//找最大的len[i]
//last为最长的递增子序列的最后一个字符的位置
max = 0;
int last;
for(i=0;i<length;i++)
{
if(len[i]>max)
{
max = len[i];
last = i;
}
}
cout<<"最长递增子序列的长度为:"<<max<<endl;
cout<<"最长递增子序列为:"<<endl;
print_it(str,pre,last);
cout<<endl;
}
system("pause");
return 0;
}
-----------------------------------------------程序测试----------------------------------------
请输入案例个数:
2
请输入字符串:
abceabf
最长递增子序列的长度为:5
最长递增子序列为:
abcef
请输入字符串:
abcabcdef
最长递增子序列的长度为:6
最长递增子序列为:
abcdef
请按任意键继续. . .
分享到:
相关推荐
动态规划的常见类型包括背包问题、最长公共子序列、最短路径问题等。在ACM竞赛中,可能会遇到一些变种或综合题,例如: 1. **0-1背包问题**:给定物品的重量和价值,以及背包的容量,求解最大价值的装包方案。 2. *...
最长不下降子序列(Longest Increasing Subsequence, LIS)是计算机科学中的一种经典问题,尤其在算法竞赛(ACM)中常被用作测试数据结构和动态规划技能的题目。该问题的目标是从一个给定的序列中找出一个尽可能长的...
3. **动态规划**:背包问题、最长公共子序列、最长递增子序列等,这些问题在ACM中很常见。 4. **字符串处理**:KMP算法、Rabin-Karp字符串匹配、Z函数等,用于处理字符串相关问题。 5. **数学工具**:大整数运算、模...
- **最长递增子序列**:在给定序列中找到长度最长的递增子序列。 - **矩阵链乘法**:寻找计算一系列矩阵乘积的最优括号方式,以最小化运算次数。 - **编辑距离**:衡量两个字符串通过插入、删除、替换操作转换成...
给定一个包含`n`个元素的数列`a1, a2, …, an`,求该序列中单调不升子序列(即序列中的每个元素都不大于其前一个元素)中最长者(即最长单调不升子序列)的长度。 **示例**: 对于序列`34, 78, 53, 36, 40`,其中...
- **最长递增子序列**:找到一个序列的最长递增子序列,利用子问题的最优解性质。 - **矩阵链乘法**:寻找最小代价的矩阵乘积顺序。 5. **学习资源** - `DP.ppt` 可能是一个关于动态规划的PPT教程,涵盖了基本...
例如,经典的动态规划问题包括Fibonacci数列、0/1背包问题、最长递增子序列等。在ZOJ和POJ这样的在线判题平台上,有很多动态规划的题目供参赛者练习,通过解决这些题目,可以深入理解和掌握动态规划的运用。 动态...
3. **常见动态规划问题**:资料中可能会涵盖一些经典的动态规划题目,如斐波那契数列、最长递增子序列、石子游戏、矩阵链乘法等,每个问题都配有详尽的解题思路和代码实现。 4. **记忆化搜索**:动态规划的一个重要...
8. **常见问题类型**:包括最长公共子序列、最长上升子序列、背包问题、最小编辑距离、最短路径问题(如Floyd-Warshall算法)、最大流问题等。 9. **实例解析**:例如,经典的“硬币找零”问题,我们可以定义一个二...
4. **最长递增子序列**:在给定序列中找出最长的非降序子序列,常用于处理排序和搜索问题。 5. **状态转移方程**:根据问题特性构建状态转移方程,例如斐波那契数列、矩阵链乘法等。 6. **网络流问题**:如最大流...
- 基本的动态规划问题,如斐波那契数列、最长递增子序列、最小路径覆盖等。 - 背包问题,包括完全背包、部分背包和多重背包。 - 图的最短路径问题,如Dijkstra算法和Bellman-Ford算法。 - 最佳二叉树和树形动态规划...
在这个专题中,我们将深入探讨三个经典动态规划问题:矩阵连乘积、最长有序子序列以及最长公共子序列。每个问题都有其独特的解决思路,并在计算机科学和算法竞赛(ACM)中具有重要地位。 首先,我们来看**矩阵连乘...
可以使用动态规划构建一个辅助数组,其中每个元素存储其前缀中的最长递增子序列的长度,最终找到整个序列的最长递增子序列。 最后,动态规划在解决最短路径问题上也有重要作用,如Dijkstra算法和Floyd-Warshall算法...
动态规划的核心思想是通过分解问题,将其拆分为更小的子问题,然后存储子问题的解,避免重复计算,从而提高效率。在解决动态规划问题时,通常涉及三个关键要素:状态、阶段和决策。 1. 状态:状态是问题在某个特定...
2. 数学问题:如斐波那契数列、矩阵链乘、最长递增子序列等,这些问题往往可以通过定义状态和转移方程来解决。 3. 图论问题:如最短路径问题(Dijkstra算法、Bellman-Ford算法)、最小生成树(Prim算法、Kruskal...
在ACM竞赛编程中,递归与动态规划是两种非常重要的算法思想,它们在解决复杂问题时发挥着关键作用。动态规划尤其适用于那些具有重叠子问题和最优子结构特征的问题,而递归则常常是这些问题的自然表达方式。下面我们...
### 最长公共子序列问题详解 #### 一、引言 最长公共子序列(Longest Common Subsequence, LCS)问题是计算机科学领域中一个经典的算法问题,它主要应用于文本比较、生物信息学中的DNA序列比对等领域。本文将详细...
【动态规划】是一种重要的算法思想,常用于解决最优化问题,通过将复杂问题分解成子问题,然后构建一个最优解的过程。ACM竞赛中的动态规划题目通常要求在限制的时间内找到最优解,因此对算法的时间复杂度有较高要求...