hdu 2167 状态压缩

/*与1565的解法差不多*/

#include<stdio.h>
#include<string.h>
int map[16][16];
int dp[2][1<<16];
int h[1<<16];
int Max(int a,int b)
{
 return a>b?a:b;
}
int main()
{
 int m,i,j,k,max;
 m=0;
 for(i=0;i<(1<<16);i++)
  if((i&(i<<1))==0)
   h[m++]=i;
  char s[1001];
  while(gets(s))
  {
   
   int len=strlen(s);
   if(len==0)
    break;
   int num=0;
   for(i=0;i<len;i+=3)
   {
    map[0][num++]=10*(s[i]-'0')+(s[i+1]-'0');
   }
   for(i=1;i<num;i++)
   {
    gets(s);
    int k=0;
    for(j=0;j<len;j+=3)
     map[i][k++]=10*(s[j]-'0')+(s[j+1]-'0');
   }
   memset(dp,0,sizeof(dp));
   int p=0;
   for(i=0;i<num;i++)
   {
    p^=1;
    for(j=0;j<m;j++)
    {
     if(h[j]>(1<<num))
      break;
     max=0;
     for(k=0;k<num;k++)
      if(h[j]&(1<<k))
       max+=map[i][k];
      for(k=0;k<m;k++)
      {
       if(h[k]>(1<<num))
        break;
       if(h[j]&h[k])
        continue;
       if(h[j]&(h[k]<<1))
        continue;
       if(h[j]&(h[k]>>1))
        continue;
       dp[p][h[j]]=Max(dp[p][h[j]],dp[1-p][h[k]]+max);
      }
    }
   }
   int max=0;
   for(i=0;i<m&&i<=(1<<num);i++)
    if(max<dp[p][h[i]])
     max=dp[p][h[i]];
    printf("%d ",max);
   getchar();
  }
  return 0;
}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410990.html