动态规划学习--经典例题(一)

最长不降子列:

  

解题思路:

              常规思路

 

      穷举—>从第一个数开始,慢慢往后面去寻找比他大的数,但是会发现,其实这样根本找不到最优的那个解,有时候看似最优,其实不是最优选择,即有后效性

 

              正确思路

 

      确定一个最大的数,从这个数往前找。这样每个数都有一个对应的最长上升子列,到了最后的数,就有了要求的最长上升子列

 

              Maxlen[]储存最长上升子列的长度:

A[]

1

7

3

5

9

4

10

Maxlen[]

1

2

2

3

4

3

5

 

 

 

 

    

 1 /*
 2     递推型动态规划
 3         求最长上升子列
 4         从局部到整体,先确定最大的那个值,之后一步步往回求
 5 
 6 */
 7 
 8 #include<iostream>
 9 #include<algorithm>
10 #include<cstring>
11 using namespace std;
12 
13 #define Max 101
14 
15 int main() {
16     int a[Max],maxlen[Max];
17     int n;
18     int i,j;
19     cout<<"请输入数组的长度"<<endl;
20     cin>>n;
21     cout<<"请输入数组的数据"<<endl;
22     for(i=1; i<=n; i++) {
23         cin>>a[i];
24         maxlen[i]=1;
25     }
26     for(i=2; i<=n; i++)
27         for(j=1; j<i; j++)
28             if(a[j]<a[i]) {
29                 maxlen[i]=max(maxlen[j]+1,maxlen[i]);//可能存在 maxlen[i]比 maxlen[j]+1大,所以要进行比较 
30             }
31     cout<<* max_element(maxlen+1,maxlen+ n + 1);//找出最大值
32     return 0;
33 }
View Code

 

原文地址:https://www.cnblogs.com/printwangzhe/p/12318804.html