首先引出一个例子
问题 :
给你一个长度为 6 的数组 , 数组元素为 { 1 ,4,5,6,2,3,8 } , 则其最长单调递增子序列为 { 1 , 4 , 5 , 6 , 8 } , 并且长度为 5 。
分析 :
题目所要找的递增子序列 , 想想有什么特点呢 ? 是不是会发现 所有的递增序列 ,前一个数一定小于后一个数 ,并且如果给所有从小到大的数标号 , 会得到一串递增的数 。
既然是借助动态规划分析问题 , 那么当前的产生的结果 , 仅仅只与前一次状态有关 ,一直推的话 , 那么是不是就很自然地想到我最最简单的问题就是当数组中的元素只有一个的时候 , 并且我还要在开一个数组 , 记录所有元素的位置 。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std ; #define Min(a,b) a>b?b:a #define Max(a,b) a>b?a:b int main ( ) { int arr[7] = { 1 , 4 , 5 , 6 , 2 , 3 , 8 } ; int pt[10] ; for ( int i = 0 ; i < 7 ; i++ ) pt[i] = 1 ; for ( int i = 1 ; i < 7 ; i++ ) { for ( int j = 0 ; j < i ; j++ ) { if ( arr[i] > arr[j] && pt[j]+1 > pt[i] ) // 注意一定要是 pt[j]+1 > pt[i] pt[i] = pt[j] + 1 ; } } int maxn = 0 ; for ( int i = 0 ; i < 7 ; i++ ) maxn = max ( maxn , pt[i] ) ; cout << maxn << endl ; return 0 ; }
顺便给出 pt[ ] 数组中所存的数据
时间: 2024-10-14 12:00:55