zoukankan      html  css  js  c++  java
  • 插头Dp总结

    T1 HDU1693:Eat the Trees

    题目大意:给出n*m的方格,有些格子不能铺线,其它格子必须铺,可以形成多个闭合回路。问有多少种铺法?

    插头Dp板子题,题目要求可以是多个回路,

    只需要两个状态,代表是否有插头即可

    $plug_1$ $plug_2$

    0     0     新建一个插头插向两边  

    0     1     转/不转弯

    1     0     同上

    1     1     合并插头


    T2 Ural 1519 Formula 1

    题目大意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数

    与T1不同的是必须是一个闭合回路

    类似于括号匹配,两个插头代表是左右

    $plug_1$ $plug_2$

    0     0     新建一个插头插向两边 

    0     1     转/不转弯

    0     2     同上

    1     0     同上

    1     1     合并插头,并且把$plug_2$的右插头改为左插头

    1     2     注意这种情况一定是一对插头碰到了一起,直接判断是不是最后一个方块统计答案或者弃掉

    2     0    转/不转弯

    2     1    直接合并

    2     2     合并插头,并把$plug_1$的左插头改为左插头改为右插头


     T3 神奇游乐园

    题目描述

    经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回。在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼。往下仔细一看,才发现这是一个游乐场,专为旅途中疲惫的人设计。娱乐场可以看成是一块大小为n×m的区域,且这个n×m的区域被分成n×m个小格子,每个小格子中就有一个娱乐项目。然而,小P并不喜欢其中的所有娱乐项目,于是,他给每个项目一个满意度。满意度为正时表示小P喜欢这个项目,值越大表示越喜欢。为负时表示他不喜欢,这个负数的绝对值越大表示他越不喜欢。为0时表示他对这个项目没有喜恶。小P决定将飞艇停在某个小格中,然后每步他可以移动到相邻的上下左右四个格子的某个格子中。小P希望找一条路径,从飞艇所在格出发,最后又回到这个格子。小P有一个习惯,从不喜欢浪费时间。因此,他希望经过每个格子都是有意义的:他到一个地方后,就一定要感受以下那里的惊险和刺激,不管自己是不是喜欢那里的娱乐项目。而且,除了飞艇所在格,其他的格子他不愿意经过两次。小P希望自己至少要经过四个格子。在满足这些条件的情况下,小P希望自己玩过的娱乐项目的满意度之和最高。你能帮他找到这个最高的满意度之和吗?

    输入格式

    第一行为两个正整数n和m,表示游乐场的大小为n×m。
    n和m满足:2<=n<=100,2<=m<=6。
    接下来的n行,每行有m个整数,第i行第j列表示游乐场的第i行第j列的小格子中的娱乐项目的满意度,满意度的范围是[-1000,1000]。同一行的两个整数之间用空格隔开。

    输出格式

    输出文件中仅一行为一个整数,表示最高的满意度之和。

     这道题与T2类似,只是不需覆盖满,仍要特别注意1-2合并的情况


    T4标识设计

    题目描述

    一家缩写为 LLL 的公司正在设计 logo,他们的初步方案是在一张方格上放置三个 L 形的图案以及一些额外的装饰性图形。例如:

    image (灰色区域表示装饰性图形)

    三个 L 图案和装饰性图形均放置在方格之中,且必须占满方格,「L」的横竖笔画长短均可,但长度必须大于零(即不能退化为一条线段)。另外,为了使 L 图形醒目且容易识别,设计师规定三个 L 形图案之间不能有重叠或交叉的部分。当然,L 形图案也不能穿过装饰图形或与之重叠。

    现在设计师已经确定了所有装饰性图形的位置,希望你计算一下放置不同的 L 形图案总共可以设计出多少个 logo。

    设dp[i][j][k][l][r]代表到了第i行第j列已经设计了k个'L'型,斜着有没有插头,其他插头的分布状态是r(已经预处理)的方案数  

    直接轮廓线Dp即可,分类讨论比较简单不再描述


    T5ParkII

    题目大意:要求找一条路径,使得每个点最多经过一次,并且点权值之和最大。

    很不错的一道题,插头的定义能对前面的题有一个更深的理解

    这道题与T3区别在于不需要是一条回路,

    这样便会出现一些在当前状态下没有与其匹配的插头,

    我们不妨称其为独立插头,用3来表示,

    当然当前状态下可能会出现2个独立插头,它们只是还没有会合而已。

    $plug_1$ $plug_2$

    0  0  建立一对(1,2)/某个方向建立3

    0  1  转/不转/停止并且2改3

    0  2  转/不转/停止并且1改3

    0  3  转/不转

    1  0  同0,1

    1  1  右2改1

    1  2  (只剩一对1,2)则更新ans

    1  3  左2改3

    2  0  同0,2

    2  1  合并

    2  2  左1改2

    2  3  左1改3

    3  0  转/不转/(只剩一个3)则更新ans

    3  1  右2改3

    3  2  右1改3

    3  3  (只剩一对3,3)则更新ans

    插头dp的ans更新一般都比较神奇,可能不局限于最后的某一个状态,而是在dp的过程中对于某些可以终止的状态进行统计

    比如说这个题,可以在(只剩一对3,3),(只剩一对1,2)(只剩一个3)的情况下更新答案

  • 相关阅读:
    Elasticsearch(ES) 创建索引
    Elasticsearch(ES) 下载&安装
    一文带您了解 Elasticsearch 中,如何进行索引管理(图文教程)
    Spring Boot 2.0 快速集成整合消息中间件 Kafka
    一文教您如何通过 Docker 搭建反向代理 Ngnix,并配置 Https SSL 证书
    Django开发文档-域用户集成登录
    Python实现按键精灵(二)-找图找色
    Python学习笔记-SQLSERVER的大批量导入以及日常操作(比executemany快3倍)
    Python爬虫案例-获取最新的中国行政区域划分
    PostgreSQL自动更新序列sequence
  • 原文地址:https://www.cnblogs.com/AthosD/p/12013583.html
Copyright © 2011-2022 走看看