題目:售貨員的難題(狀壓dp)

售貨員的難題

  • 題目描述
  • 輸入輸出格式
    • 輸入格式:
    • 輸出格式:
  • 輸入輸出樣例
    • 輸入樣例#1:
    • 輸出樣例#1:
  • 思路
  • AC代碼:

題目描述

某鄉有n個村莊( 1 < n <= 16 ),有一個售貨員,他要到各個村莊去售貨,各村莊之間的路程s(0 < s < 1000)是已知的,且A村到B村與B村到A村的路大多不同。為了提高效率,他從商店出發到每個村莊一次,然后返回商店所在的村,假設商店所在的村莊為1,他不知道選擇什么樣的路線才能使所走的路程最短。請你幫他選擇一條最短的路。

輸入輸出格式

輸入格式:

第一行一個數n表示村莊數
接下來是一個n×n的矩陣,表示各村莊之間的路程。

輸出格式:

最短的路程。

輸入輸出樣例

輸入樣例#1:

3
0 2 1
1 0 2
2 1 0 

輸出樣例#1:

3

思路

這是一道狀壓dp,所以做這道題之前需要先知道一些關于狀態壓縮的基本概念。簡單來說,就是在一般的題目里,一個數組即可保存狀態。但是有這樣的一些題 目,它們具有DP問題的特性,但是狀態中所包含的信息過多,如果要用數組來保存狀態的話需要四維以上的數組。于是,我們就需要通過狀態壓縮來保存狀態,而 使用狀態壓縮來保存狀態的DP就叫做狀態壓縮DP。例如這道售貨員難題,若有n 個村莊,想要表示是否經過每個村莊的狀態,則需要使用n維數組,而采取狀態壓縮,往往利用二進制的整數來簡單的表示狀態,如 0101 0101 0101,則表示經過了 1 1 1 3 3 3號村莊,沒有經過 2 2 2 4 4 4號村莊。

我先介紹一下位運算相關的知識:
在這里插入圖片描述

還有幾種在狀壓dp中常見的應用如下:
1.判斷一個數字x二進制下第i位是不是等于1。

方法:if ( ( ( 1 << ( i - 1 ) ) & x ) > 0)

將1左移i-1位,相當于制造了一個只有第i位上是1,其他位上都是0的二進制數。然后與x做與運算,如果結果>0,說明x第i位上是1,反之則是0。

2.將一個數字x二進制下第i位更改成1。

方法:x = x | ( 1<<(i-1) )

證明方法與1類似,此處不再重復證明。

3.把一個數字二進制下最靠右的第一個1去掉。

方法:x=x&(x-1)

回過頭來看這道題,n<20,使用狀態壓縮將會很方便,dp[i][j]表示從起始點到i號點在j狀態下花費的最短路程,例如n=3,dp[3][3],即表示從起始點到3號點,在011,也就是經過了1號點和2號點的情況的最短路程。
詳細的狀態方程可以見代碼,再填出dp表格后,比較不同的點在經過所有點后到起始點的路程,便可以得到答案

AC代碼:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int map[21][21];
int dp[21][40000]; 
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>map[i][j];}}memset(dp,64,sizeof(dp));dp[1][1]=0;for(int i=0;i<=(1<<n);i++)//枚舉路線{for(int j=1;j<=n;j++)//枚舉村莊 {if(((1<<(j-1))&i)==0)//如果第i號村莊沒去過第j號村莊就往下 {for(int q=1;q<=n;q++)//枚舉村莊 {if(1<<(q-1)&i)//如果第i號村莊去了第q號村莊就往下 {dp[j][1<<j-1|i]=min(dp[j][1<<j-1|i],dp[q][i]+map[q][j]);//dp[j][1<<j-1|i]為:經過i號村莊去j號村莊//dp[q][i]+map[q][j]為:經過i號村莊去q號村莊,再從q號村莊去j號村莊//類似于Floyd}}}}}int ans=9999999;for(int i=2;i<=n;i++){ans=min(ans,dp[i][(1<<n)-1]+map[i][1]);//判斷從1號村莊去哪一號村莊可以更快的跑完}cout<<ans<<endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

consul限制注冊的ip

假設當前服務器的ip是&#xff1a;192.168.56.130 1、允許 所有ip 注冊(驗證可行) consul agent -server -ui -bootstrap-expect1 -data-dir/usr/local/consul -nodedevmaster -advertise192.168.56.130 -bind0.0.0.0 -client0.0.0.0 2、只允許 當前ip 注冊 consul agent -…

Leetcode33 搜索旋轉排序數組

題解&#xff1a; /*** 旋轉排序數組可分為N1 N2兩個部分&#xff0c;如&#xff1a;[4,5,6,7,1,2,3]&#xff0c;N1為[4,5,6,7]&#xff0c;N2為[1,2,3]** 必然滿足以下兩個條件&#xff1a;* 1. N1和N2都是分別遞增的&#xff1b;* 2. N1中的所有元素大于N2中的所有元素;** …

【Python機器學習】實驗12 基于神經網絡的回歸-分類實驗

文章目錄 神經網絡的回歸例1 基于神經網絡的回歸(簡單例子)1.1 導入包1.2 構造數據集&#xff08;隨機構造的&#xff09;1.3 構造訓練集和測試集1.4 構建神經網絡模型1.5 采用訓練數據來訓練神經網絡模型 實驗1 基于神經網絡的分類(鳶尾花數據集)1.1 導入包1.2 構造數據集1.3 …

Selenium瀏覽器自動化測試框架簡單介紹

selenium簡介 介紹   Selenium [1] 是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作一樣。支持的瀏覽器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Googl…

系統學習Linux-MongoDB

概述 mongodb是一個nosql數據庫&#xff0c;它有高性能、無模式、文檔型的特點。是nosql數據庫中功能最豐富&#xff0c;最像關系數據庫的。數據庫格式為BSON 相關概念實例&#xff1a;系統上運行的mongodb的進程&#xff0c;類似于mysql實例&#xff1b;庫&#xff1a;每個數…

用cpolar生成的公網地址,對位于本地的Cloudreve網盤進行訪問

文章目錄 1、前言2、本地網站搭建2.1 環境使用2.2 支持組件選擇2.3 網頁安裝2.4 測試和使用2.5 問題解決 3、本地網頁發布3.1 cpolar云端設置3.2 cpolar本地設置 4、公網訪問測試5、結語 1、前言 自云存儲概念興起已經有段時間了&#xff0c;各互聯網大廠也紛紛加入戰局&#…

MySQL 自增 ID 默認從 1 開始,如何設置自增 ID 從 0 開始

MySQL 是一種關系型數據庫&#xff0c;它是世界上最流行的關系型數據庫之一。在 MySQL 中&#xff0c;自增是一種非常有用的功能&#xff0c;它可以自動給主鍵賦值&#xff0c;并保證每個主鍵是唯一的。然而&#xff0c;許多人不知道的是&#xff0c;MySQL 默認情況下從 1 開始…

ArcGIS Pro如何制作不規則形狀圖例

在默認的情況下&#xff0c;ArcGIS Pro生成的圖例是標準的點、直線和矩形的&#xff0c;對于湖泊等要素而言&#xff0c;這樣的表示方式不夠直觀&#xff0c;我們可以將其優化一下&#xff0c;制作不規則的線和面來代替原有圖例&#xff0c;這里為大家介紹一下制作方法&#xf…

BERT數據處理,模型,預訓練

代碼來自李沐老師《動手學pytorch》 在數據處理時&#xff0c;首先執行以下代碼 def load_data_wiki(batch_size, max_len):"""加載WikiText-2數據集"""num_workers d2l.get_dataloader_workers()data_dir d2l.download_extract(wikitext-2, w…

django——配置 settings.py 及相關參數說明

3. 配置 settings.py 及相關參數說明 3.1 配置setting.py文件 設置setting.py文件 加入安裝的庫 apps.erp_test, rest_framework, django_filters, drf_spectacular,加入新增的APP users啟動項目 # 運行項目先執行數據庫相關操作&#xff0c;再啟動 django 項目 python manag…

【JavaSE】面向對象之繼承

繼承 繼承概念繼承的語法父類成員的訪問子類和父類沒有同名成員變量子類和父類有同名成員變量成員方法名字不同成員方法名字相同 super關鍵字子類構造方法super和this繼承方式 繼承概念 繼承(inheritance)機制&#xff1a;是面向對象程序設計使代碼可以復用的最重要的手段&…

docker 安裝nacos

1、下載nacos docker pull nacos/nacos-server2、啟動nacos docker run --restart always --env MODEstandalone --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos/nacos-server3、驗證nacos http://localhost:8848/nacos 默認用戶名和密碼&#xff1a;nacos

lvs集群與nat模式

一&#xff0c;什么是集群&#xff1a; 集群&#xff0c;群集&#xff0c;Cluster&#xff0c;由多臺主機構成&#xff0c;但是對外只表現為一個整體&#xff0c;只提供一個訪問入口&#xff08;域名與ip地址&#xff09;&#xff0c;相當于一臺大型計算機。 二&#xff0c;集…

Java書簽 #使用MyBatis接入多數據源

楔子&#xff1a;當然&#xff0c;世上有很多優秀的女性&#xff0c;我也會被她們吸引。這對男人來說是理所當然的。但目光被吸引和內心被吸引是截然不同的。- 東野圭吾《黎明之街》 今日書簽 在一些應用場景中&#xff0c;可能需要連接多個不同的數據庫&#xff0c;例如連接不…

Centos 防火墻命令

查看防火墻狀態 systemctl status firewalld.service 或者 firewall-cmd --state 開啟防火墻 單次開啟防火墻 systemctl start firewalld.service 開機自啟動防火墻 systemctl enable firewalld.service 重啟防火墻 systemctl restart firewalld.service 防火墻設置開…

8.15 IO的多路復用

select的TCP客戶端 poll的TCP客戶端

Chart GPT免費可用地址共享資源

GPT4.0&#xff1a; https://gpt4e.ninvfeng.xyz github:https://github.com/ninvfeng/chatgpt4 WeUseAi&#xff1a;https://chatb.weuseai.pro AI.LS&#xff1a;https://n7.gpt03.xyz ChatX (iOS/macOS應用)&#xff1a;https://itunes.apple.com/app/id6446304087 ch…

C/C++ : C/C++的詳解,C語言與C++的常用算法以及算法的各自用法和應用(初級,中級),C++ CSP考題(J居多,S偏少)的詳解,NOI的真題題解

目錄 1.C語言 2.C 3.C與C語言的共同/不同點 4.導讀 5.相關文章 5.1&#xff1a;Dev-C是Windows 環境下的一個輕量級 C/C 集成開發環境&#xff08;IDE&#xff09; 5.2&#xff1a;C是從C語言發展而來的&#xff0c;而C語言的歷史可以追溯到1969年 6.C/C最新年度總…

?LeetCode解法匯總88. 合并兩個有序數組

目錄鏈接&#xff1a; 力扣編程題-解法匯總_分享記錄-CSDN博客 GitHub同步刷題項目&#xff1a; https://github.com/September26/java-algorithms 原題鏈接&#xff1a;力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 描述&#xff1a; 給你兩個按…

解決方案:如何在 Amazon EMR Serverless 上執行純 SQL 文件?

長久已來&#xff0c;SQL以其簡單易用、開發效率高等優勢一直是ETL的首選編程語言&#xff0c;在構建數據倉庫和數據湖的過程中發揮著不可替代的作用。Hive和Spark SQL也正是立足于這一點&#xff0c;才在今天的大數據生態中牢牢占據著主力位置。在常規的Spark環境中&#xff0…