题意:给出m个长为n的字符串 (2个)s1,s2. 表示这个补丁打之前要是s1的状态,打完之后就变成s2的状态。然后每个补丁有一个执行时间,初始状态是都有bug,问你最少用多少时间把这些bug全部修好。 分析:由于补丁可以任意地打和不打,所以当修完补丁后,很可能会回到以前的状态,说明这个关系是一个DAG,有向无环图,如果使用记忆化搜索或者dp都是错误的,因为在递归时上一个状态还没计算完成,就回到了以前的状态,造成无限递归。dp与图论息息相关,我们把补丁看作状态,用一个二进制数s表示当前的bug有没有,打完补丁又变成了下一个状态。把状态看作顶点,转移花费(执行时间)看作边权,问题显然转化为最短路. 但问题还没解决!顶点太多了高达2的20次方! 但注意,有些顶点根本是没有办法达到的,因为m很小,不可能每个点都有用,所以我们没有必要把完整的图建立出来,而是使用隐式图搜索的思路,每次到达一个点,不是去枚举它的边,而是直接枚举m个补丁(枚举所有的边,因为m非常小)。 代码:
#include
using namespace std;
int n,m;
const int maxn=(1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?