【问题描述】
ib 被困在了一个美术馆里,她需要收集美术馆内的每种颜料才能获得逃出美
术馆的钥匙
美术馆由 n*m 的房间构成,每个房间里有一种颜料,解锁进入后就可以收集.
有的房间不能解锁,如果解锁的话会直接进入 Bad End.
ib 现在位于美术馆的最北面.她可以解锁东,南,西三面的房间,或者进入一个
已经解锁过的房间(包括起点)
ib 手上有一些玫瑰.解锁房间可能减少(或增加)ib 的玫瑰.我们定义每个房间
的权值为解锁会减少的 ib 的玫瑰数量(如果增加的话,为负值).
现在 ib 想知道,在收集所有颜料的情况下,最少减少的玫瑰数量(如果可以增加
的话,为负值).ib 还是个孩子,所以希望你告诉她.
【输入格式】
从文件 ib.in 中读入数据
第一行为三个正整数 n,m,k,k 代表颜料的数量.
接下来为 n 行 m 个整数,描述这个美术馆中颜料的分布情况
第 i 行第 j 个整数(a[i][j])代表从北数第 i 个,从西数第 j 个房间中的颜料,如果为
-1,代表此房间不能解锁
接下来为 n 行 m 个整数,描述这个美术馆房间的权值
第 i 行第 j 个整数(b[i][j])代表从北数第 i 个,从西数第 j 个房间的权值.
【输出格式】
输出到文件 ib.out 中.
为一行一个整数,代表最少减少的玫瑰数量(如果可以增加的话,为负值).
如果无解,输出”Bad End”(不含引号)
【样例输入 1】
4 4 3
1 1 1 1
1 -1 2 -1
1 3 -1 1
1 1 1 1
1 2 3 4
1 2 90 3
1 90 1 -1
-1 -1 -1 -1
【样例输出 1】
182
【样例说明 1】
下图是样例 1 的染料和权值分布情况示意图
Color 代表染料
Val 代表房间权值
房间上的小门代表这个房间会被解锁【样例输入 2】
4 4 2
2 2 2 -1
2 -1 2 -1
2 2 -1 1
2 2 2 2
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
【样例输出 2】
Bad End
【数据规模与约定】
对于 20%的数据,满足 n<=4,m<=4,k<=3
对于 60%的数据,满足 n*m<=50
对于 100%的数据,满足
1<=n*m<=200,1<=m<=n,1<=k<=5,a[i][j]=-1 或 1<=a[i][j]<=k,-1e9<=b[i][j]<=1e9

因为n×m<=200且m<=n,所以m最大为14,k最大为5

所以我们状态压缩

f[S][P]表示房间经过状态为S,颜料持有状态为P

枚举每一行转移

O(2^20*14)

转移分几步:

1.将上一行的已有状态S',一个个减去1,转移到当前状态

显然这是可以的

2.枚举上一行所有状态S,一个个加上1,看是否可行,然后转移

为什么会有不可行?

10000001

00011000

显然是不行的,就是这一行的状态存在连续的一段不与上一行相交

3.对每一个这一行的房间状态捡到的颜料转移

f[S][P|val[S]]=min(f[S][P])

4.给每一个这一行的房间状态加上对应的权值

f[S][P]+=flower[S];

分别对应代码四种颜色

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
lol f[<<][<<],inf;
lol fl[<<],ans,b[][];
int a[][],val[<<];
int n,m,k;
int lowbit(int x)
{
return (x&(-x));
}
bool pd(int x,int y)
{
if (x>&&((x>>)&y)) return ;
if (x<(<<m)-&&((x<<)&y)) return ;
return ;
}
int main()
{int i,j,l;
freopen("ib.in","r",stdin);
freopen("ib.out","w",stdout);
cin>>n>>m>>k;
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
{
scanf("%lld",&b[i][j]);
}
}
memset(f,,sizeof(f));
inf=f[][];
f[(<<m)-][]=;
for (i=;i<=n;i++)
{
45 for (j=(1<<m)-1;j>=0;j--)
46 {
47 int x=j;
48 while (x)
49 {
50 for (l=0;l<(1<<k);l++)
51 f[j-lowbit(x)][l]=min(f[j-lowbit(x)][l],f[j][l]);
52 x-=lowbit(x);//除去最后一位1
53 }
54 }
55 for (j=0;j<(1<<m);j++)
56 {
57 int x=j;
58 while (x<(1<<m)-1)
59 {
60 int y=x;
61 x=x|(x+1);//给最靠左的0赋为1
62 if (pd(x^y,j))//判断这一状态与上一状态是否可达
63 {
64 for (l=0;l<(1<<k);l++)
65 f[j+(x^y)][l]=min(f[j+(x^y)][l],f[j][l]);
66 }
67 }
68 }
69 for (j=1;j<=m;j++)
70 {
71 if (a[i][j]==-1)
72 {
73 val[(1<<j-1)]=-1;
74 }
75 else val[(1<<j-1)]=1<<(a[i][j]-1);
76 fl[(1<<j-1)]=b[i][j];
77 }
78 for (j=1;j<(1<<m);j++)
79 {
80 if (val[j-lowbit(j)]==-1||val[lowbit(j)]==-1)
81 {
82 val[j]=-1;
83 for (l=0;l<(1<<k);l++)
84 f[j][l]=inf;
85 }
86 else
87 {
88 val[j]=val[lowbit(j)]|val[j-lowbit(j)];//合并出j状态所减少的玫瑰
89 fl[j]=fl[lowbit(j)]+fl[j-lowbit(j)];
90 for (l=0;l<(1<<k);l++)
91 f[j][l|val[j]]=min(f[j][l|val[j]],f[j][l]);//对于捡到的颜料转移
92 }
93 }
94 for (j=1;j<(1<<m);j++)
95 for (l=0;l<(1<<k);l++)
96 if (f[j][l]!=inf) f[j][l]+=fl[j];
97 }
ans=inf;
for (i=;i<(<<m);i++)
{
ans=min(ans,f[i][(<<k)-]);
}
if (ans>=inf)
cout<<"Bad End\n";
else cout<<ans;
}

伊布(ib)的更多相关文章

  1. 详细对比IB开发与纯手码开发的优劣。

    1.IB是什么? Interface Builder 是一种通过图形化界面搭建UI的方式,并把窗口.菜单栏以及窗口上的各种控件的对象都“冻结”在了一个 NIB文档里:程序运行时,这些对象将会“苏醒”. ...

  2. iOS开发~interface Builder(简称 IB) 界面构建器

    1.interface Builder 设置界面 1.1 是什么? 一个可视化的界面编辑工具软件,在xcode4之后整合到了xcode中 1.2 作用? 通过可视化的界面设置,能够少写或不写代码而完成 ...

  3. [IB配置]PeopleSoft如何重置网关属性administrator密码

    当您在登陆主菜单>PeopleTools>继承代理程序>配置>网关>网关设置属性在尝试打开网关属性配置时候,需要输入账号:administrator以及密码,有时候在升级 ...

  4. [IB]PeopleSoft异步详细信息中状态“已完成”但订阅合同状态“新建”问题

    最近遇到一个IB异步程序状态不一致问题,异步详细信息中上面的状态是“DONE”但是订阅合同中还是“新建”状态.在域状态中清除域状态也不管用. 重启app server也不好使.最后执行了appmsgp ...

  5. Xcode工程编译错误之iOS开发之Xcode9报错 Compiling IB documents for earlier than iOS7 is no longer supported.

    概要: 在我们升级到Xcode9时,最低的编译版本为iOS8,但是在使用一些SDK的时候就会报出Compiling IB documents for earlier than iOS7 is no l ...

  6. iOS开发之Xcode9报错 Compiling IB documents for earlier than iOS7 is no longer supported.

    升级到Xcode9时,最低的编译版本为iOS8,但是在使用一些SDK的时候就会报出Compiling IB documents for earlier than iOS7 is no longer s ...

  7. xib Nib IB 可视化编程详解

    简单的说,Xib就是拖控件编程,也可以说是可视化编程. 相对于代码,使用IB和xib文件来组织UI,可以省下大量代码和时间,从而得到更快的开发速度. 如果你曾经受到过微软家Visual Basic或者 ...

  8. Advanced Simulation Library(ASL)&& An adaptive and distributed-memory parallel implementation of the immersed boundary (IB) method (IBAMR)

    How to install asl and ibamr tools: ASL 和 IBAMR 都是有限元分析的工具,流体力学等,ASL可以使用GPU加速计算, 主机配置,i7 6代,1060, 32 ...

  9. [New learn]AutoLayout调查基于IB

    代码:https://github.com/xufeng79x/AutoLayout-IB 1.简介 Autolayout旨在解决不同高宽度的屏幕下的显示问题,通过增加给控件增加约束来达到不同屏幕间的 ...

随机推荐

  1. python3.* socket例子

    On Server: # -*- coding: utf-8 -*-#this is the server import socketif "__main__" == __name ...

  2. 一个毕生难忘的BUG

    记得以前接手过一个Java项目,服务器程序,直接让Jar在linux上跑的那种, 这个项目由两个web服务组成,也就是两条Java进程,主进程 xxx.jar,辅助进程 xxx_helper.jar. ...

  3. LeetCode & Q88-Merge Sorted Array-Easy

    Array Two Pointers Description: Given two sorted integer arrays nums1 and nums2, merge nums2 into nu ...

  4. Python基础学习篇章三

    一. Python对象类型 1. 对象是Python最基本的概念,一个Python程序可以分解为模块.语句.表达式.和对象.它们的关系如下:(1)程序由模块构成 (2)模块包含语句 (3)语句包含表达 ...

  5. vueJs 源码解析 (三) 具体代码

    vueJs 源码解析 (三) 具体代码 在之前的文章中提到了 vuejs 源码中的 架构部分,以及 谈论到了 vue 源码三要素 vm.compiler.watcher 这三要素,那么今天我们就从这三 ...

  6. Spring知识点回顾(01)Java Config

    Spring知识点回顾(01) 一.Java Config 1.服务和服务注入 2.Java 注解 :功能更强一些 3.测试验证 二.注解注入 1.服务和服务注入 2.配置加载 3.测试验证 三.总结 ...

  7. SpringCloud的EurekaClient : 客户端应用访问注册的微服务(无断路器场景)

    演示客户端应用如何访问注册在EurekaServer里的微服务 一.概念和定义 采用Ribbon或Feign方式访问注册到EurekaServer中的微服务.1.Ribbon实现了客户端负载均衡,2. ...

  8. Python 编写登录接口

    流程图: 源码:

  9. 证明二叉查找树所有节点的平均深度为O(logN)

    数据结构与算法分析(c语言描述)第4章 P78 概念一:一棵树所有节点的深度和称为内部路径长 令D(N)为一棵有N节点的树的内部路径长么,即有D(1)=0, 设一棵树的左子树的内部路径长为D(i),则 ...

  10. Python之内置函数

    内置函数 python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数. 分类学习内置函数: 总共 ...