grids 2757 求最大子例长度

grids 2757 求最大子例长度
//动态规划题目最重要的一点是如何将问题分解得到子问题,并且将子问题解决
//本题以下标为状态量,找到以该下标位置 i 为终点时的最长子列:如果 i 位置的值 > i - 1位置的值,则长度加 1 ,
//所以利用判断大小来递归,出口是:下表为 0 时,长度为 1
//利用 nMaxLen【i】记录长度避免了重复计算

#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< string .h >
int  main ()
{
    
int n;
    
int b[1000];
    
int nMaxLen[1000];
    
while (scanf ("%d"&n) != EOF && 1 <= n && n <= 1000)
    
{
          memset (nMaxLen, 
0 ,sizeof(nMaxLen));
          
//将输入的数值存入数组 b 中 
          for (int i = 0; i < n; i ++)
          
{
              scanf (
"%d"&b[i]);
          }

          
          
//找到每一个状态下标 i 对应的最大子列长度,并将其存入数组nMaxLen[]中
          nMaxLen[0= 1;
          
for (int i = 1; i < n; i ++)   
          
{
              
int temp = 0;
              
for (int j = 0; j < i ; j ++)
              
{
                  
if ( b[i] > b[j])
                  
{
                       if (temp < nMaxLen[j])          //只有当当前的长度 <  之前一位数的序列长时才可以赋值,最后起到 temp + 1 的作用     
                                                                                            // 为什么:最大序列可能出现在 j 之后如: 7    9    10     6     11
                       temp = nMaxLen[j];
                  }
              }

              nMaxLen[i] 
= temp + 1;
          }

          
          
//遍历数组nMaxLen从中读出最大值,即:在该位置时取得最大的子序列
          int max = -1;
          
for (int i = 0; i < n; i ++)
          
{
              
if (nMaxLen[i] > max)
              max 
= nMaxLen[i];
          }
 
          
          printf (
"%d\n", max);
    }

    
//system ("pause");
    return 0;
}

你可能感兴趣的:(grids 2757 求最大子例长度)