hdu 4739 Zhuge Liang's Mines

今天的网络赛题目,用状态压缩的思想预处理,可以证明出20个点大概不能组成超过100个正方形。于是先预处理所有的正方形,然后0-1背包就可以了。、

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<cstdio>
#include<bitset>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define LL long long
#define PB push_back
#define MP make_pair
#define eps 1e-10
using namespace std;

const int N = 22;

struct Point
{
    int x, y;
    bool operator < (const Point& rhs) const
    {
        return x < rhs.x || (x == rhs.x && y < rhs.y);
    }
}p[N];

int n, dp[1 << N];
bool vis[1 << N];

vector<int> sqr;

bool ok(int i, int j, int k, int s)
{
    return (p[i].x == p[j].x && p[i].y == p[k].y && p[j].y  == p[s].y && p[s].x == p[k].x) && (p[k].x - p[i].x == p[j].y - p[i].y);
}

void pre()
{
    int i, j, k, s;
    sqr.clear();
    for(i = 0; i < n; i ++)
        for(j = i + 1; j < n; j ++)
            for(k = j + 1; k < n; k ++)
                for(s = k + 1; s < n; s ++)
                    if(ok(i, j, k, s))
                        sqr.PB((1 << i) + (1 << j) + (1 << k) + (1 << s));
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int i, j, ans;
    while(scanf("%d", &n), n > 0)
    {
        for(i = 0; i < n; i ++)
        {
            scanf("%d%d", &p[i].x, &p[i].y);
        }
        sort(p, p + n);
        pre();
        CLR(dp, -1);
        dp[0] = 0, ans = 0;
        for(i = 0; i < sqr.size(); i ++)
        {
            for(j = 0; j < (1 << n); j ++)
            {
                if(((j & sqr[i]) == 0) && dp[j] != -1)
                {
                    dp[j | sqr[i]] = max(dp[j | sqr[i]], dp[j] + 1);
                    ans = max(dp[j + sqr[i]], ans);
                }
            }
        }
        printf("%d\n", ans * 4);
    }
}


《C 程序设计语言》(原书第4版)是C 领域最经典的参考书,介绍了C 11的各项新特性和新功能。全书共分四部分。第一部分(第1~5章)是引言,包括C 的背景知识,C 语言及其标准库的简要介绍;第二部分(第6~15章)介绍C 的内置类型和基本特性,以及如何用它们构造程序;第三部分(第16~29章)介绍C 的抽象机制及如何用这些机制编写面向对象程序和泛型程序;第四部分(第30~44章)概述标准库并讨论一些兼容性问题。由于篇幅问题,原书中文版分两册出版,分别对应原书的第一至三部分和第四部分。这一册为第一至三部分。 目录 第3版前言 第2版前言 第1版前言 第一部分 引言 第1章 致读者 2 第2章 C++概览:基础知识 32 第3章 C++概览:抽象机制 51 第4章 C++概览:容器与算法 74 第5章 C++概览:并发与实用功能 96 第二部分 基本功能 第6章 类型与声明 116 第7章 指针、数组与引用 148 第8章 结构、联合与枚举 173 第9章 语句 194 第10章 表达式 208 第11章 选择适当的操作 236 第12章 函数 264 第13章 异常处理 297 第14章 名字空间 337 第15章 源文件与程序 362 第三部分 抽象机制 第16章 类 386 第17章 构造、清理、拷贝和移动 413 第18章 运算符重载 452 第19章 特殊运算符 471 第20章 派生类 495 第21章 类层次 524 第22章 运行时类型信息 547 第23章 模板 566 第24章 泛型程序设计 595 第25章 特例化 613 第26章 实例化 629 第27章 模板和类层次 645 第28章 元编程 661 第29章 一个矩阵设计 701
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值