【问题描述】
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. 项目Alpha冲刺Day3

    一.会议照片 二.项目进展 1.今日安排 服务器后台基本搭建完成,完成帐号权限一小部分完成并进行框架使用练手. 2.问题困难 跨专业成员不熟java的开发,有一名成员之前主要做安卓的,所以有比较多的东 ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)11.14

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: PM对整个项目的需求进行讲解: 全队对整个项目的细节进行沟通: 对整个项目的开发计划进行分析,分配每天的任务: 统一确定项目的开发环境 ...

  3. iOS开发-即时通信XMPP

    1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...

  4. python的PEP8 代码风格指南

    PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...

  5. Beta冲刺Day6

    项目进展 李明皇 今天解决的进度 进行前后端联动调试 明天安排 完善程序运行逻辑 林翔 今天解决的进度 服务器端发布消息,删除消息,检索消息,个人发布的action 明天安排 图片功能遇到问题,微信小 ...

  6. JAVA线程池原理详解(1)

    线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线 ...

  7. sublime安装 和 插件安装

    先从官网下载sublime   https://www.sublimetext.com/3 安装完毕后 快捷键ctrl+` 或者View->Show Console,输入如下代码(sublime ...

  8. c# 字符串的内存分配和驻留池( 转 )

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: string s1 = "he ...

  9. HTTP请求到爬虫代码的终南捷径

    前阵子在做爬虫的时候学会了各种抓包,看到http请求的时候硬拼代码实在有点累. 后来发现Postman工具是直接可以把Postman请求直接生成对应的代码,这样一下来就美滋滋了. 那么最后的问题就成了 ...

  10. SpringCloud的Hystrix(二) 某消费者应用(如:ui、网关)访问的多个微服务的断路监控

    一.验证断路保护监控是否管理多个消费者 app 1.第1个消费者应用:访问自己封装rest服务 saleProd 2.第2个消费者应用:第二个应用没有反应 说明 1.每个应用实例的断路保护机制,只对本 ...