zoukankan      html  css  js  c++  java
  • HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个

    解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数,

    则有dp[i][j] = SUM(dp[k][j-1])  (a[k] < a[i] && k < i)

    不可能直接遍历,所以考虑优化,可以看出dp方程相当于一个区间求和,所以可以用树状数组来优化。

    代码:

    #include <iostream>
    #include <cmath>
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #define SMod 123456789
    #define lll __int64
    using namespace std;
    #define N 10007
    
    lll c[N],a[N],b[N];
    int n,m;
    lll dp[N][104];
    
    int lowbit(int x)
    {
        return x & (-x);
    }
    
    void modify(int pos,lll val)
    {
        while(pos <= n)
        {
            c[pos] += val;
            pos += lowbit(pos);
        }
    }
    
    lll getsum(int pos)
    {
        lll res = 0;
        while(pos > 0)
        {
            res = (res+c[pos])%SMod;
            pos -= lowbit(pos);
        }
        return res;
    }
    
    int main()
    {
        int i,j;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=1;i<=n;i++)
            {
                scanf("%I64d",&a[i]);
                b[i] = a[i];
            }
            sort(b+1,b+n+1);
            memset(dp,0,sizeof(dp));
            for(i=1;i<=n;i++)
                dp[i][1] = 1;
            for(j=2;j<=m;j++)
            {
                memset(c,0,sizeof(c));
                for(i=1;i<=n;i++)
                {
                    int ind = lower_bound(b+1,b+n+1,a[i])-b;
                    dp[i][j] = getsum(ind-1);
                    modify(ind,dp[i][j-1]);
                }
            }
            lll ans = 0;
            for(i=1;i<=n;i++)
                ans = (ans + dp[i][m])%SMod;
            printf("%I64d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    JS-得到屏幕宽高、页面宽高
    CSS3-border-radius 属性
    从30岁到35岁:为你的生命多积累一些厚度【转载】
    HTML5-IOS WEB APP应用程序(IOS META)
    HTML-Meta中的viewport指令
    EasyUI-window包含一个iframe,在iframe中如何关闭window
    JS-为句柄添加监听函数
    EasyUI-EasyUI框架入门学习
    Linux下的C编程
    ***经典笔试题
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3961018.html
Copyright © 2011-2022 走看看