1 条题解

  • 1
    @ 2022-8-28 9:27:31
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #define rt1 rt<<1
    #define rt2 (rt<<1)|1
    using namespace std;
    int dp[(1<<11)+5][(1<<11)+5];
    int v[(1<<11)+5][(1<<11)+5];
    int cv[(1<<11)+5];
    int ori[(1<<11)+5];
    int temp[(1<<11)+5];
    int lq[20],rq[20];
    int n;
    void dfs(int rt,int l,int r,int sit,int dep)
    {
        if(l==r)
        {
            dep--;
            dp[rt][0]=dp[rt][1]=0;
            if(ori[l])
            {
                dp[rt][1]=cv[l];
            }else
            {
                dp[rt][0]=cv[l];
            }
            for(int i=1;i<=dep;i++)
            {
                int mid=(lq[i]+rq[i])>>1;
                if((sit&(1<<(dep-i))))
                {
                    if(l<=mid)
                    {
                        dp[rt][0]+=v[l][rq[i]]-v[l][mid];
                    }else
                    {
                        dp[rt][0]+=v[l][mid]-v[l][lq[i]-1];
                    }
                }else
                {
                    if(l<=mid)
                    {
                        dp[rt][1]+=v[l][rq[i]]-v[l][mid];
                    }else
                    {
                        dp[rt][1]+=v[l][mid]-v[l][lq[i]-1];
                    }
                }
            }
            return;
        }
        int mid=(l+r)>>1;
        int len=r-l+1;
        lq[dep]=l;
        rq[dep]=r;
        dfs(rt1,l,mid,(sit<<1),dep+1);
        dfs(rt2,mid+1,r,(sit<<1),dep+1);
        memset(temp,0x3f,sizeof(temp));
        for(int i=0;i<=len/2-1;i++)
        {
            for(int j=0;j<=i;j++)
            {
                temp[i]=min(temp[i],dp[rt1][j]+dp[rt2][i-j]);
            }
        }
        for(int i=0;i<=len/2-1;i++)
        {
            dp[rt][i]=temp[i];
        }
        dfs(rt1,l,mid,(sit<<1)|1,dep+1);
        dfs(rt2,mid+1,r,(sit<<1)|1,dep+1);
        memset(temp,0x3f,sizeof(temp));
        for(int i=len/2;i<=len;i++)
        {
            for(int j=0;j<=i;j++)
            {
                temp[i]=min(temp[i],dp[rt1][j]+dp[rt2][i-j]);
            }
        }
        for(int i=len/2;i<=len;i++)
        {
            dp[rt][i]=temp[i];
        }
    }
    int main()
    {
        scanf("%d",&n);
        n=(1<<n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&ori[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&cv[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                scanf("%d",&v[i][j]);
                v[j][i]=v[i][j];
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                v[i][j]=v[i][j-1]+v[i][j];
            }
        }
        memset(dp,0x3f,sizeof(dp));
        dfs(1,1,n,0,1);
        int ans=2147483647;
        for(int i=0;i<=n;i++)
        {
            ans=min(ans,dp[1][i]);
        }
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    1495
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    4
    已通过
    4
    上传者