Codeforces Hello 2018 E题Logical Expression dp+最短路 好题
j题目链接: http://codeforces.com/contest/913/problem/E
题意:
给你x,y,z三个变量,与& 或| 非! 括号() 四种运算符,规定括号和非优先级最高,其次与&,最后或|。
对于输入的真值表,输出最小字典序的逻辑表达式
挺难想的。关键点在于怎么定义状态并利用已有状态更新出新状态,并处理优先级问题。
状态转移:
对于两个表达式A1,A2及其真值表T1,T2,若没有优先级的问题,A1&A2的真值表为T1&T2,A1|A2的真值表为T1|T2,!A1的真值表为~T1。
为了解决优先级的问题,按优先级不同进行分类,以dp[i][j]存储真值表为i,优先级为j的字典序最小逻辑表达式。,操作只在相同优先级表达式之间进行,维护一个优先级之间的升降通道。
模仿dijkstra的思想,维护一个序列,每次选出字典序最小的表达式作为A1并pop掉,在dp[i][j]中枚举A2进行更新操作。
真值表共有2^(2^3)共256种,优先级共3种可能。状态数n=3*256。
每种状态至多作为A1被考虑一次,枚举A2O(n),综合得算法复杂度O(n^2)
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int FULL=0xFF;
bool cmp(string a,string b)
{
if(a.length()==b.length()) return a<b;
return a.length()<b.length();
}
struct Expression
{
int table;
int level;
string exp;
Expression(int a,int b,string c) {table=a;level=b;exp=c;}
bool operator < (const Expression& b)const
{
if(b.exp==exp)
{
if(level!=b.level) return level<b.level;
return table<b.table;
}
return cmp(exp,b.exp);
}
};
set<Expression> q;
string dp[<<][];
void add(int level,int state,string s)
{
if(dp[state][level].empty()||cmp(s,dp[state][level]))
{
dp[state][level]=s;
Expression e(state,level,s);
q.insert(e);
}
}
void pre()
{
int X_table=,Y_table=,Z_table=;
for(int i=;i<;++i)
{
if(i&(<<)) X_table+=(<<i);
if(i&(<<)) Y_table+=(<<i);
if(i&(<<)) Z_table+=(<<i);
}
add(,X_table,"x");
add(,Y_table,"y");
add(,Z_table,"z");
while(!q.empty())
{
set<Expression>:: iterator it;
it=q.begin();
Expression u=*it;
q.erase(it);
// auto u=*q.begin();
// q.erase(q.begin());
if(u.level==)
{
add(,u.table^FULL,"!"+u.exp);
add(,u.table,u.exp);
}
if(u.level==)
{
for(int i=;i<=FULL;++i)
{
if(!dp[i][].empty())
{
add(,i&u.table,dp[i][]+"&"+u.exp);
add(,i&u.table,u.exp+"&"+dp[i][]);
}
}
add(,u.table,"("+u.exp+")");
add(,u.table,u.exp);
}
if(u.level==)
{
for(int i=;i<=FULL;++i)
{
if(!dp[i][].empty())
{
add(,i|u.table,dp[i][]+"|"+u.exp);
add(,i|u.table,u.exp+"|"+dp[i][]);
}
}
add(,u.table,"("+u.exp+")");
}
}
}
void work()
{
int n;
scanf("%d",&n);
string s;
for(int i=;i<=n;++i)
{
cin>>s;
// cout<<"s="<<s<<endl;
int state=;
for(int j=;j<;++j)
{
if(s[j]=='') state|=(<<j);
}
//printf("state=%d\n",state);
cout<<dp[state][]<<endl;
}
}
int main()
{
pre();
work();
return ;
}
Codeforces Hello 2018 E题Logical Expression dp+最短路 好题的更多相关文章
- 思维题练习专场-DP篇(附题表)
转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8536399.html 听说今年省选很可怕?刷题刷题刷题 省选已经结束了但是我们要继续刷题刷题刷题 目标是“有思维 ...
- codeforces 931E Logical Expression dp
time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【CodeForces】913 E. Logical Expression
[题目]E. Logical Expression [题意]令x=11110000(2),y=11001100(2),z=10101010(2),n次询问,每次要求用[与][或][非][括号]构成含至 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- Codeforces 438E The Child and Binary Tree [DP,生成函数,NTT]
洛谷 Codeforces 思路 看到计数和\(998244353\),可以感觉到这是一个DP+生成函数+NTT的题. 设\(s_i\)表示\(i\)是否在集合中,\(A\)为\(s\)的生成函数,即 ...
- 乘风破浪:LeetCode真题_010_Regular Expression Matching
乘风破浪:LeetCode真题_010_Regular Expression Matching 一.前言 关于正则表达式我们使用得非常多,但是如果让我们自己写一个,却是有非常大的困难的,我们可能想到状 ...
- Codeforces 148D Bag of mice:概率dp 记忆化搜索
题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
随机推荐
- 某mac最简单调节亮度
说明 mac用户其实都可以使用 背景 很多人都说需要打补丁啊,或者修改什么的,我试过不管用.不如通过软件调节.. 正文 从appstore下载 Brightness Slider 即可,虽然不能达到系 ...
- oracle如何调试存储过程
oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能 先按简单的存储过程做个例子,就是上次做的存储过程(proc_test) 1.先在数据库的procedures文 ...
- Sorting a Three-Valued Sequence(三值的排序)
Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交换的 ...
- Python_Mix*OS模块,序列化模块种的json,pickle
os.path.basename(path)返回path最后的文件名,如何path以/或\结尾,那么就会返回空值,即os.path.split(path)的第一个元素 ret = os.path.ba ...
- js 数据处理
开发过程中经常遇到 1. json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12} ...
- day43-python消息队列二-queue模块
Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...
- vue教学视频(小程序教学视频)
写在前面 最近通过了解众多面试者的面试情况 总结出以下几点: 对框架的要求越来越高特别是vue和小程序 不会vue和小程序连面试机会都没有 会vue的比不会vue的薪资高4-5k 小程序有发展的趋势 ...
- python 提取字符串中的指定字符 正则表达式
例1: 字符串: '湖南省长沙市岳麓区麓山南路麓山门' 提取:湖南,长沙 在不用正则表达式的情况下: address = '湖南省长沙市岳麓区麓山南路麓山门' address1 = address.s ...
- egret 简单的一笔画算法,在wing中可以直接跑(以后玩这类游戏就有个作弊器了)
/** * 在Main中创建游戏场景 * Create a game scene */ private createGameScene() { MtwGame.Instance.init(this.s ...
- 高通sdm845_la2.0源码编译及使用QFIL刷机
一.下载源码 高通芯片代码下载地址:https://chipcode.qti.qualcomm.com/ . *_amss_standard_oem : 高通私有源码(*为sdm845-la--. * ...