hdu2167 状态压缩~最优值

做过hdu1565,这题写起来就很简单了,先把状态dfs出来,再把图预处理好,然后直接两层循环搞定。


ACcode:

#include<cstdio>
#include<cstring>

int const NS=15;
int const INF=1<<30;

int n,lim,top,res;
int g[NS][NS],dp[2][1<<NS];
int state[1<<NS][2],num[NS][1<<NS];
char str[100];

void dfs(int pos,int s1,int s2)
{
    if (pos==n)
    {
        state[top][0]=s1;
        state[top++][1]=s2;
        return ;
    }
    dfs(pos+1,s1<<1,s2<<1);
    if ((s1&1)==0&&(s2&1)==0)
    dfs(pos+1,s1<<1|1,s2<<1),
    dfs(pos+1,s1<<1,s2<<1|1);
}

void Init(int f)
{
    for (int i=0;i<lim;i++)
    dp[f][i]=0;
}

int Max(int a,int b)
{
    return a>b?a:b;
}

int main()
{
    int p,q,t,now,pre;
    while (gets(str))
    {
        t=strlen(str);
        if (t==0) continue;
        n=(t+1)/3,top=0;
        lim=1<<n,dfs(0,0,0);
        for (int i=0;i<t;i+=3)
        g[0][i/3]=(str[i]-'0')*10+str[i+1]-'0';
        for (int i=1;i<n;i++)
        for (int j=0;j<n;j++)
        scanf("%d",&g[i][j]);
        for (int j,k,i=0;i<top;i++)
        for (t=state[i][1],j=0;j<n;j++)
        for (num[j][t]=k=0;k<n;k++)
        if ((1<<k)&t) num[j][t]+=g[j][k];

        res=now=0,pre=1,Init(now);
        for (int i=0;i<n;i++)
        {
            now^=1,pre^=1,Init(now);
            for (int j=0;j<top;j++)
            p=state[j][0],q=state[j][1],
            dp[now][q]=Max(dp[now][q],dp[pre][p]+num[i][p]);
        }
        for (int i=0;i<lim;i++)
        res=Max(res,dp[now][state[i][1]]);
        printf("%d\n",res);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值