zoukankan      html  css  js  c++  java
  • HDU4739Zhuge Liang's Mines(状压)

    链接

    预处理出只有四个1的情况存入数组中 然后状压下

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 using namespace std;
     7 #define N 1050000
     8 int dp[2][N];
     9 int q[2][N];
    10 int pt[N];
    11 bool f[N];
    12 struct node
    13 {
    14     int x,y;
    15 }pp[25];
    16 bool cmp(node a,node b)
    17 {
    18     if(a.x==b.x)
    19     return a.y<b.y;
    20     return a.x<b.x;
    21 }
    22 int main()
    23 {
    24     int n,i,j,k,o,p[25][2];
    25     while(scanf("%d",&n)!=EOF)
    26     {
    27         if(n==-1)
    28         break;
    29         memset(dp,0,sizeof(dp));
    30         for(i = 0; i < n ; i++)
    31         scanf("%d%d",&pp[i].x,&pp[i].y);
    32         sort(pp,pp+n,cmp);
    33         k = 0;
    34         for(i = 0 ; i < 1<<n ; i++)
    35         {
    36             o = 0;
    37             for(j = 0 ; j < n ; j++)
    38             {
    39                 if(i&(1<<j))
    40                 {
    41                     o++;
    42                     p[o][0] = pp[j].x;
    43                     p[o][1] = pp[j].y;
    44                 }
    45             }
    46             if(o==4)
    47             {
    48                 int x1,x2;
    49                 if(p[1][0]==p[2][0]&&p[3][0]==p[4][0]&&p[2][1]==p[4][1]&&p[1][1]==p[3][1])
    50                 {
    51                     x1 = p[2][1]-p[1][1];
    52                     x2 = p[3][0]-p[1][0];
    53                     if(x1==x2)
    54                     {
    55                         k++;
    56                         q[1][k] = i;
    57                         dp[1][i] = 4;
    58                         pt[k] = i;
    59                     }
    60                 }
    61             }
    62         }
    63         int tt = k;
    64         o=k;
    65         for(i = 2; i <= n/4+1 ; i++)
    66         {
    67             k = tt;tt=0;
    68             for(j = 1 ; j <= k ; j++)
    69             {
    70                 for(int g = 1 ; g <= o ; g++)
    71                 {
    72                     if(q[(i-1)%2][j]&pt[g])
    73                     continue;
    74                     int x = q[(i-1)%2][j]+pt[g];
    75                     dp[i%2][x] = max(dp[i%2][x],dp[(i-1)%2][q[(i-1)%2][j]]+4);
    76                     if(!f[x])
    77                     {
    78                         f[x] = 1;
    79                         tt++;
    80                         q[i%2][tt] = x;
    81                     }
    82                 }
    83             }
    84         }
    85         int ans=0;
    86         for(i = 0 ; i < 1<<n ; i++)
    87         {
    88             ans = max(ans,max(dp[0][i],dp[1][i]));
    89         }
    90         printf("%d
    ",ans);
    91     }
    92     return 0;
    93 }
    View Code
  • 相关阅读:
    167. 两数之和 II
    14. 最长公共前缀
    28. 实现strStr()
    118. 杨辉三角
    54. 螺旋矩阵
    498. 对角线遍历
    66. 加一
    747. 至少是其他数字两倍的最大数
    34. 在排序数组中查找元素的第一个和最后一个位置
    164. 寻找峰值
  • 原文地址:https://www.cnblogs.com/shangyu/p/3323351.html
Copyright © 2011-2022 走看看