zoukankan      html  css  js  c++  java
  • hdu 4570 Multi-bit Trie 区间DP入门

    Multi-bit Trie

    题意:将长度为n(n <= 64)的序列分成若干段,每段的数字个数不超过20,且每段的内存定义为段首的值乘以2^(段的长度);问这段序列总的内存最小为多少?

    思路:区间的最值,区间DP;

    枚举长度,在初始化时,将长度和20比较,小于20看成是一段,大于20时,因为不能压缩,直接全部分割就是了;之后枚举区间内部的所有值,这是并不需要考虑将这个区间一分为二后各自的长度是否大于20,因为在子结构中已经计算好了;直接去最优解即可;

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    #include<vector>
    #include<cmath>
    #include<stdlib.h>
    #include<time.h>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    using namespace std;
    #define rep0(i,l,r) for(int i = (l);i < (r);i++)
    #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
    #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
    #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
    #define MS0(a) memset(a,0,sizeof(a))
    #define MS1(a) memset(a,-1,sizeof(a))
    #define MSi(a) memset(a,0x3f,sizeof(a))
    #define inf 0x3f3f3f3f
    #define lson l, m, rt << 1
    #define rson m+1, r, rt << 1|1
    typedef pair<int,int> PII;
    #define A first
    #define B second
    #define MK make_pair
    typedef __int64 ll;
    template<typename T>
    void read1(T &m)
    {
        T x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        m = x*f;
    }
    template<typename T>
    void read2(T &a,T &b){read1(a);read1(b);}
    template<typename T>
    void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
    template<typename T>
    void out(T a)
    {
        if(a>9) out(a/10);
        putchar(a%10+'0');
    }
    ll dp[70][70],f[70],sum[70];
    void solve(int n)
    {
        MSi(dp);
        for(int i = 0;i < n;i++){//[j,j+i] 区间内数的个数为i + 1;
            for(int j = 1;j <= n - i;j++){
                int t = j + i;
                if(i < 20) dp[j][t] = f[j]*(1<<(i+1));//看成一段
                else dp[j][t] = (sum[t] - sum[j-1])*2;// **乘2
                for(int k = j + 1;k < t;k++){//区间DP中并不需要再次看k - j与20比较
                    dp[j][t] = min(dp[j][t],dp[j][k] + dp[k + 1][t]);
                }
            }
        }
    }
    int main()
    {
        int T,n;
        read1(T);
        while(T--){
            read1(n);
            sum[0] = 0;
            rep1(i,1,n) read1(f[i]),sum[i] = sum[i - 1] + f[i];
            solve(n);
            out(dp[1][n]);puts("");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    【leetcode】106. Construct Binary Tree from Inorder and Postorder Traversal
    【leetcode】105. Construct Binary Tree from Preorder and Inorder Traversal
    【leetcode】236. Lowest Common Ancestor of a Binary Tree
    【leetcode】235. Lowest Common Ancestor of a Binary Search Tree
    【leetcode】352. Data Stream as Disjoint Intervals
    【leetcode】897. Increasing Order Search Tree
    【leetcode】900. RLE Iterator
    BEC listen and translation exercise 26
    BEC listen and translation exercise 25
    BEC listen and translation exercise 24
  • 原文地址:https://www.cnblogs.com/hxer/p/5233229.html
Copyright © 2011-2022 走看看