首页 > 其他分享 >洛谷-P1171-售货员的难题

洛谷-P1171-售货员的难题

时间:2024-07-31 23:28:13浏览次数:13  
标签:short 洛谷 mat int unsigned P1171 售货员 dp

Abstract

传送门
也算是状压 dp 模板题?不过这个数据给的有点阴间了,空间不够用,需要搞一个奇妙的优化。

idea

所谓状压,就是用数字表示当前状态,比如说 0110100 这个数字,我们可以把 01 分别看作是是否到达过第 i 个点的标记。那么我们可以用 dp[i][j] 表示第 i 个状态下,快递员到达 j 号点的最短路,细节的部分看代码注释吧。

Code

#include <bits/stdc++.h>
using namespace std;

unsigned short mat[300][390]; // 存图
const unsigned short maxn = 21;
unsigned short dp[(1 << maxn) - 1][22];

int main()
{
    unsigned short n;
    cin >> n;
    for (unsigned short i = 1; i < n + 1; i++)
    {
        for (unsigned short j = 1; j < n + 1; j++)
        {
            cin >> mat[i][j];
        }
    }
    memset(dp, 0x3f3f, sizeof dp); // short int 初始化为这么大就够啦
    dp[1][1] = 0;                  // 出发点最短距离当然是 0 了
    // 这地方 i 的数据类型必须是 int ,不然表示不了那么多状态
    for (int i = 1; i <= (1 << n) - 1; i++) // 枚举每一个状态
    {
        for (unsigned short j = 1; j <= n; j++) // 枚举下一个要去的点
        {
            if (((1 << j - 1) & i) == 0) // 检查这个点是不是被访问过
            {
                for (unsigned short k = 1; k <= n; k++) // 枚举中介点
                {
                    if ((1 << k - 1) & i) // 可以作为中介点
                    {
                        dp[i | (1 << j - 1)][j] = min(dp[i | (1 << j - 1)][j], (unsigned short)(dp[i][k] + mat[k][j]));
                    }
                }
            }
        }
    }

    unsigned short ans = USHRT_MAX;
    for (unsigned short i = 1; i < n + 1; i++)
    {
        ans = min(ans, (unsigned short)(dp[(1 << n) - 1][i] + mat[i][1]));
    }
    cout << ans;
    return 0;
}

标签:short,洛谷,mat,int,unsigned,P1171,售货员,dp
From: https://www.cnblogs.com/carboxylBase/p/18335733

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室
    原题链接:https://www.luogu.com.cn/problem/P1083题意解读:已知第i天有r[i]个教室可以供租借,有m个租借教室的订单,第i订单需要在第s[i]~t[i]天区间内租借d[i]个教室,计算是否全部订单都能满足,如果不满足要输出从第几个订单开始不满足。解题思路:1、朴素做法枚举1~m个订单,通过差分......
  • 洛谷题单指南-前缀和差分与离散化-P3406 海底高铁
    原题链接:https://www.luogu.com.cn/problem/P3406题意解读:1-n个城市共了n段路,第i段路不买卡票价a[i],买卡票价b[i](卡本身花费c[i]),给定一个路程顺序,计算最少的通行费用。解题思路:根据路程,计算每段路各走了多少次,然后对于每段路,计算买卡和不买卡两种花费,取较小的累加即可。如何......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......
  • 洛谷 P1162 填涂颜色 广度优先搜索
    记录学习填涂颜色题目描述由数字000组成的方阵中,有一任意形状的由数字11......
  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 洛谷 Markdown - 从入门到精通
    洛谷Markdown-从入门到精通编写——Jerrycyx(CSDN,洛谷)洛谷博客查看因为洛谷博客的渲染机制和其它地方不一样,可能导致渲染错误,所以你可以到这里食用:https://www.luogu.com.cn/paste/wu019n2x绪论希望更丰富的展现?使用Markdown。这是洛谷文字编辑时会出现的一行文字。......
  • 洛谷Day1--P1102 A-B数对 P1163 银行贷款
    目录一、引言二、题目及题解题目一:P1102A-B数对题目链接题解:哈希 题目二:P1163银行贷款题目链接题解:二分 三、小结一、引言今天是周日,代码随想录训练营的打卡休息一天。想着刷一点题巩固一下之前的所学,就做了两道洛谷的题,一道用的哈希(也可以二分,个人感觉麻烦......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • 洛谷P2440 题解
    P2440题解题目传送门提取关键词,题目需要的是数量大于$k$的最大$l$,考虑二分答案。可以二分枚举$l$的值,check函数中检验切割出该长度小段木头的个数,与$k$进行比较。小数据模拟例如,我们有五根木棍且$k=4$,分别为374106第一次循环$l=0,r=9,mid=4$。check函数中得到......