• 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
  • 相关阅读:
    查看电脑保存的wifi密码
    数据仓库
    nodejs 中国汉字模糊查询简单(很low)实现
    nodejs express 框架 上传文件
    async样例
    mongodb Map/reduce测试代码
    未释放资源的教训,开发MongoDB连接一定要关闭连接
    采集系统优化:大家接手过的最烂的项目,最坑爹的项目是哪个?
    Android的HttpClient调用,冲突的解决办法
    MongoDBcrud操作,采集部分代码
  • 原文地址:https://www.cnblogs.com/hxer/p/5233229.html
Copyright © 2020-2023  润新知