首页 > 其他分享 >动态规划——DP与最短路 学习笔记

动态规划——DP与最短路 学习笔记

时间:2023-10-07 16:24:57浏览次数:46  
标签:return int 短路 笔记 b1 heap DP dis

动态规划——DP与最短路 学习笔记

例题:P2761 软件补丁问题,很容易写出转移方程:\(dp_s \leftarrow dp_{s \setminus F_1 \cup F_2} + t_i\),

但是这样就出现了环,没有形成 DAG 就无法跑动态规划了,怎么办?

可以将原问题转换为[最短路]:

将原状态 \(s\) 记为一个点,将原转移路径记为一条边 \((s, s')\),然后跑最短路即可。

这种问题的转移方程,形如:\(f_v = f_u + w\),即有边 \((u \rightarrow v, w)\)。

当然前提是状态数不能太多,因为最短路的复杂度为 \(O(n ^ 2)\),或 \(O(m \log n)\),根据情况选择。

代码:

typedef pair<int, int> PII;

const int N = 21, M = 110;

int n, m, t[M];
int b1[M], b2[M], f1[M], f2[M];

int cuse(int s, int i) {
    if ((s & b1[i]) == b1[i] && (s & b2[i]) == 0) return (s & ~f1[i]) | f2[i];
    return -1;
}

int dis[1 << N];
bool st[1 << N];

int dijkstra(int s, int e) {
    memset(dis, 0x3f, sizeof dis); const int INF = dis[0];
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    dis[s] = 0; heap.push({0, s});
    while (heap.size()) {
        int u = heap.top().second, d = heap.top().first, v; heap.pop();
        if (st[u]) continue; st[u] = true;
        for (int i = 0; i < m; ++i) {
            if ((v = cuse(u, i)) == -1) continue;
            if (dis[v] > d + t[i]) {
                dis[v] = d + t[i];
                heap.push({dis[v], v});
            }
        }
    }
    return dis[e] == INF ? 0 : dis[e];
}

signed main() {
    n = ur, m = ur; char b[N], f[N];
    for (int i = 0; i < m; ++i) {
        t[i] = ur; scanf("%s %s", b, f);
        for (int j = 0; j < n; ++j) {
            if (b[j] == '+') b1[i] |= 1 << j;
            else if (b[j] == '-') b2[i] |= 1 << j;
            if (f[j] == '-') f1[i] |= 1 << j;
            else if (f[j] == '+') f2[i] |= 1 << j;
        }
    }
    printf("%lld\n", dijkstra((1 << n) - 1, 0));
    return 0;
}

标签:return,int,短路,笔记,b1,heap,DP,dis
From: https://www.cnblogs.com/RainPPR/p/dp-and-shortest-path.html

相关文章

  • 利用LNMP实现wordpress站点搭建
     #环境准备:nginx+php+wordpress10.0.0.152mysql+redis10.0.0.162#在10.0.0.162编写脚本实现mysqk数据库一键安装[root@localhost~]#catinstall_mysql.sh#!/bin/bash##********************************************************......
  • wordpress 编写插件实现自动汇总超链接
    背景写长篇文章时,文章内容可能会引用了很多外站的超链接。事后我再来翻阅文章,找到想要的超链很吃力。尝试过在插件商城寻找现有的插件,都不太令人满意。因为需求其实很简单:将文章内容中出现过的超链接,汇总展示在文章的末尾,类似论文的引用文献。‍实施将如下代码,放在wordpres......
  • Python笔记目录
    Python笔记目录本视频学习自b站python视频,原地址在此笔记在原版笔记的基础上根据自己的理解做了调整,与原版的顺序和内容有有些区别笔记仅供学习使用,侵删第一章Python的安装、卸载第二章PyCharm的下载、安装、使用第三章Python的编写和运行第四章Python的基础语法......
  • 学习笔记4——第七八章
    文件操作和系统调用文件操作级别文件和目录的基本操作创建文件:使用touch命令或编程语言中的文件创建函数。这会在文件系统中创建一个新的空文件。创建目录:使用mkdir命令或编程语言中的目录创建函数。这会在文件系统中创建一个新的目录。复制文件或目录:使用cp命令......
  • 密码协议学习笔记(1.4):密码学的一些数学基础
    数学基础:抽象代数:一个算符的代数结构:幺半群:数的集合和一个算符构成的代数结构$(G,+)$,且满足封闭性结合律存在恒等元(在群中我习惯这么叫,避免混淆)群:满足如下条件的代数结构$(G,+)$:封闭性结合律存在恒等元对于每个元素均存在逆元交换群/阿贝尔群:满足如......
  • NetCore学习笔记:单元测试和集成测试
    前言#我在使用AspNetCore的这段时间内,看了很多开源项目和博客,发现各种.Net体系的新技术很多人都有关注和使用,但却很少有人关注测试。测试是软件生命周期中的一个非常重要的阶段,对于保证软件的可靠性具有极其重要的意义。在应用程序的开发过程中,为了确保它的功能与预期一致,......
  • Java 学习笔记
    Java学习笔记dos环境下(Windows即cmd)的Java命令先用javac文件名.java;命令,编译java文件,生成一个后缀为class、名与类名相同的文件。再用java类名命令,执行文件。当类名前的修饰符为public时,类名必须和源文件名一致。并且以上操作不能执行带package的java文......
  • 如何在ipad上对pdf做笔记
    在iPad上做笔记,您可以按照以下步骤:1.选择一个文本编辑应用程序,如GoogleDocs、GoodNotes、Notability或OneNote。2.打开文本编辑器应用程序,并在其中输入要记录的文本。3.点击文本编辑器应用程序的“标记”(菜单)图标。4.从弹出的菜单中,选择“注释”选项。5.在注释选项卡上,点击“......
  • 代码源:互不侵犯(SCOI,状压DP)
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,m;longlongf[10][1024][100];intv[1024];voidinit(){ for(inti=1;i<1<<n;++i) { intc=0; for(intj=i;j;j=j&(j-1))c++; v[i]=c; }}intmain(){ ios::sync_with_std......
  • JAVA学习笔记1
    private封装extends继承编译类型是爷爷多态整个继承过程构造器必须首行引用爷爷的构造器(用super)点击查看代码packagecom.hspstudy.Test1;publicclassExtend_{publicstaticvoidmain(String[]a){GraFathergraFather=newGraFather("勤才",......