hdu 4570

108 篇文章 0 订阅

Multi-bit Trie

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 251 Accepted Submission(s): 86


Problem Description
  IP lookup is one of the key functions of routers for packets forwarding and classifying. Generally, IP lookup can be simplified as a Longest Prefix Matching (LPM) problem. That's to find the longest prefix in the Forwarding Information Base (FIB) that matches the input packet's destination address, and then output the corresponding Next Hop information.

  Trie-based solution is the most wildly used one to solve LPM. As shown in Fig.1(b), an uni-bit trie is just a binary tree. Processing LPM on it needs only traversing it from the root to some leaf, according to the input packet's destination address. The longest prefix along this traversing path is the matched one. In order to reduce the memory accesses for one lookup, we can compress some consecutively levels of the Uni-bit Trie into one level, transforming the Uni-bit Trie into a Multi-bit Trie.
  For example, suppose the strides array is {3, 2, 1, 1}, then we can transform the Uni-bit Trie shown in Fig.1(b) into a Multi-bit Trie as shown in Fig.1(c). During the transforming process, some prefixes must be expanded. Such as 11(P2), since the first stride is 3, it should be expanded to 110(P2) and 111(P2). But 110(P5) is already exist in the FIB, so we only store the longer one 110(P5).
  Multi-bit Trie can obviously reduce the tree level, but the problem is how to build a Multi-bit Trie with the minimal memory consumption (the number of memory units). As shown in Fig.1, the Uni-bit Trie has 23 nodes and consumes 46 memory units in total, while the Multi-bit Trie has 12 nodes and consumes 38 memory units in total.

Input
  The first line is an integer T, which is the number of testing cases.
  The first line of each case contains one integer L, which means the number of levels in the Uni-bit Trie.
  Following L lines indicate the nodes in each level of the Uni-bit Trie.
  Since only 64 bits of an IPv6 address is used for forwarding, a Uni-bit Trie has maximal 64 levels. Moreover, we suppose that the stride for each level of a Multi-bit Trie must be less than or equal to 20.

Output
  Output the minimal possible memory units consumed by the corresponding Multi-bit Trie.

Sample Input
  
  
1 7 1 2 4 4 5 4 3

Sample Output
  
  
38
区间dp,题意真是坑啊,读也没读懂,只是,知道可以转化成区间dp,那么这题就很水了的,我们用dp[i][j]表示从i到j的最小内存,那么我们可以得出 ,dp[i][j]=fmin(dp[i][j],dp[i][k]+dp[k+1][j]),但是这题,还有一个坑人的地方,就是,题目已经说了,要求是,分成了段要小于20个,那么大于20的话,我们初始化的时候,只能,用全部不压缩的,而如果小于20的话, 我们既可以全部压缩,也可以全部不压缩,所以有两种初始化方式,取最小的始化方式!
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define MAXN 100
__int64 sum[100],dp[100][100],num[100];
__int64 fmin(__int64 a,__int64 b){if(a<b)return a;return b;}
int main ()
{
    int n,tcase,i,j,k,len;
    scanf("%d",&tcase);
    while(tcase--)
    {
        scanf("%d",&n);
        sum[0]=0;
        for(i=1;i<=n;i++)
        {
            scanf("%I64d",&num[i]);
            sum[i]=sum[i-1]+num[i];
        }
        memset(dp,0,sizeof(dp));
        for(len=0;len<n;len++)
        {
            for(i=1;i<=n&&i+len<=n;i++)
            {
                int j=len+i;
                if(len<=19)
                {
                    dp[i][j]=fmin((sum[j]-sum[i-1])*2,num[i]*(1<<(j-i+1)));
                }
                else
                {
                    dp[i][j]=(sum[j]-sum[i-1])*2;
                }
                for(k=i;k<j;k++)
                {
                    dp[i][j]=fmin(dp[i][j],dp[i][k]+dp[k+1][j]);
                }
            }
        }
        printf("%I64d\n",dp[1][n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值