zoukankan      html  css  js  c++  java
  • 递增子序列最大和(最长递增子序列) 动态规划

    对于上面的动态规划以第2个问题为例:


    最长递增子序列:dp[i]

    状态:以i为自增序列结尾的最大长度为dp[i];

    决策:从第i个往前找,找到a[j]<a[i],dp[i]=max(dp[i],dp[j]+1);(dp[j]表示符合条件的i前面的一个以j为结尾的最大长度)

    符合无后效性

    初始状态:dp[i]=1;

    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<cstdlib>
    #define INF 0x3f3f3f3f
    #define PI  3.14159
    #define N  1010
    #define MOD 9997
    using namespace std;
    int dp[N],a[N];
    int main()
    {
        int n,ans;
        while(~scanf("%d",&n))
        {
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
                scanf("%d",&a[i]);
            for(int i=0;i<n;i++)
            {
                dp[i]=1;
                for(int j=i-1;j>=0;j--)
                {
                    if(a[j]<a[i])
                        dp[i]=max(dp[i],dp[j]+1);
                }
            }
            ans=-1;
            for(int i=0;i<n;i++)
            {
                ans=ans>dp[i]?ans:dp[i];
            }
            cout<<ans<<endl;
        }
    }


    至于第一个问题只需把动态规划公式的1改为a[i]即可;

  • 相关阅读:
    r语言
    pickle模块
    mongodb简介
    oracle
    mysql
    ceph
    迭代器
    python类
    encode&decode
    PHP 截取字符串中某两个字符(串)之间的字符串 考虑多个的情况
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/9780073.html
Copyright © 2011-2022 走看看