hdu 4570 Multi-bit Trie 区间DP入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于hdu 4570 Multi-bit Trie 区间DP入门的主要内容,如果未能解决你的问题,请参考以下文章

HDU_4570_数位dp

Trie树+HDU1251

HDU 4825:Xor Sum(Trie)

HDU1671-trie树

HDU 1251 Trie树模板题

hdu 4825(Trie)