hdu 1565(状态压缩基础题)

题意:容易理解。

分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!!

代码实现:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

int n;
int dp[2][(1<<20)+10],map[25][25],a[20000],num;

void chushihua()
{
    int max=1<<20,i;
    for(i=0;i<max;i++)
     if((i&(i<<1))==0)
      a[num++]=i;
}

int qiu(int r,int flag)
{
    int i,x=1<<(n-1),sum=0;
    for(i=1;i<=n;i++)
    {
        if((x&flag)!=0)
         sum=sum+map[r][i];
        x=x>>1;
    }
    return sum;
}

void solve()
{
    int i,j,k,max,res=0,temp,p=0;
    max=1<<n;
    memset(dp,0,sizeof(dp));
    for(i=1;i<=n;i++)
    {
        p=p^1;
        memset(dp[p],0,sizeof(dp[p]));
        for(j=0;j<num&&a[j]<max;j++)
        {
            for(k=0;k<num&&a[k]<max;k++)
            {
                if((a[j]&a[k])!=0)
                 continue;
                temp=qiu(i,a[j]);
                if(dp[p][a[j]]<(temp+dp[1-p][a[k]]))
                 dp[p][a[j]]=temp+dp[1-p][a[k]];
            }
        }
    }
    for(i=0;i<num&&a[i]<max;i++)
     if(res<dp[p][a[i]])
      res=dp[p][a[i]];
    printf("%d
",res);
}

int main()
{
    int i,j;
    num=0;
    chushihua();//把所有的可能状态抽出来
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
             scanf("%d",&map[i][j]);
        solve();
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jiangjing/p/3430208.html