题解

2 条题解

  • 0
    #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;
    }
    
    
  • -2
    @ 2016-01-10 18:23:44

    虽然我没有AC但我来抢个沙发

  • 1

信息

ID
1831
难度
4
分类
(无)
标签
递交数
36
已通过
16
通过率
44%
被复制
2
上传者