SP703 SERVICE - Mobile Service[DP]

 

題意翻譯

 

Description   一個公司有三個移動服務員。如果某個地方有一個請求,某個員工必須趕到那個地方去(那個地方沒有其他員工),某一時刻只有一個員工能移動。只有被請求后,他才能移動,不允許在同樣的位置出現兩個員工。從位置P到Q移動一個員工的費用是C(P, Q)。這個函數沒有必要對稱,但是C(P, P) = 0。一開始三個服務員分別在位置1,2,3,公司必須滿足所有的請求。 目標是最小化公司的費用。 Input   第1行:2個整數L,N(3<=L<=200, 1<=N<=1000). L是位置數,每個位置從1到L編號,N是請求數。   接下來L行,每行包含L個非負整數,第i+1行的第j個數表示C(i, j),并且它小于2000.   最后一行包含N個數,是請求列表。 Output    第1行:一個數M,表示最小的服務花費

 

輸入輸出樣例

 
輸入樣例#1:?
1
5 9
0 1 1 1 1
1 0 2 3 2
1 1 0 4 1
2 1 5 0 1
4 2 3 4 0
4 2 4 1 5 4 3 2 1
輸出樣例#1:?
5

解析:

這題值得好好理解。是我滾動數組入門題目。

容易想到以當前的請求作為階段,當前服務員所在位置的最小花費作為狀態。
首先,
四維數組會爆空間。不用滾動數組也會爆空間。。。

我們假設dp[i][x][y]表示在第i個請求時,有一個服務員在x位置,一個服務員在y位置。如果x和y都不在上一個請求所在位置,那么剩下那個服務員必定在上一個請求的位置那里。

我們有三種決策:
  • 將上一個請求位置的服務員轉移到當前請求的位置上,前提是x和y都不在上一個請求所在位置;
  • 將x處的服務員轉移到當前請求的位置上,前提是y處的服務員不在當前請求的位置上(注意:上一個請求位置上的服務員不可能在此處了,不需要此條件);
  • 將y處的服務員轉移到當前請求的位置上,前提是x處的服務員不在當前請求的位置上;

我們很容易設計狀態轉移方程:

if(x!=p[i]&&y!=p[i])dp[now][x][y]=min(dp[now][x][y],dp[now^1][x][y]+a[p[i-1]][p[i]]);
if(y!=p[i])dp[now][p[i-1]][y]=min(dp[now][p[i-1]][y],dp[now^1][x][y]+a[x][p[i]]);
if(x!=p[i])dp[now][x][p[i-1]]=min(dp[now][x][p[i-1]],dp[now^1][x][y]+a[y][p[i]]);

當然,這些方程都有一個大前提,就是當前請求的x和y既不能在同一個位置上,又不能在上一個請求的位置上(注意細節)。

最后,我們檢查一遍最后一個請求時的狀態,找出最小值就OK了。

?

參考代碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<string>
 7 #include<cstdlib>
 8 #include<queue>
 9 #include<vector>
10 #define INF 0x3f3f3f3f
11 #define PI acos(-1.0)
12 #define N 201
13 #define MOD 2520
14 #define E 1e-12
15 #define ri register int
16 using namespace std;
17 int a[N][N],dp[2][N][N],p[1001];
18 inline int read()
19 {
20     int f=1,x=0;char c=getchar();
21     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
22     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
23     return x*f;
24 }
25 int main()
26 {
27     int t;
28     cin>>t;
29     while(t--)
30     {
31         memset(a,0,sizeof(a));
32         memset(p,0,sizeof(p));
33         int now=0,l,n;
34         l=read(),n=read();
35         for(ri i=1;i<=l;i++)
36          for(ri j=1;j<=l;j++) a[i][j]=read();
37         for(ri i=1;i<=n;i++) p[i]=read();
38         memset(dp[now],0x3f,sizeof(dp));
39         p[0]=3;dp[0][1][2]=0;
40         for(ri i=1;i<=n;i++){
41             now^=1;//滾動數組
42             memset(dp[now],0x3f,sizeof(dp[now]));
43             for(ri x=1;x<=l;x++)//有l個地方可以去 
44                 if(x!=p[i-1])
45                     for(ri y=1;y<=l;y++)
46                     {    
47                         if(x==y&&y==p[i-1]) continue;
48                         if(x!=p[i]&&y!=p[i])
49                             dp[now][x][y]=min(dp[now][x][y],dp[now^1][x][y]+a[p[i-1]][p[i]]);
50                         if(y!=p[i])
51                             dp[now][p[i-1]][y]=min(dp[now][p[i-1]][y],dp[now^1][x][y]+a[x][p[i]]);
52                         if(x!=p[i])
53                             dp[now][x][p[i-1]]=min(dp[now][x][p[i-1]],dp[now^1][x][y]+a[y][p[i]]);
54                     }
55         }
56         int ans=INF;
57         for(ri i=1;i<=l;i++)
58          for(ri j=1;j<=l;j++) 
59           if(i!=j&&i!=p[n]&&j!=p[n])
60             ans=min(ans,dp[now][i][j]);//另一個人在p[n]處 
61         cout<<ans<<endl;
62     }
63     return 0;
64 } 

?

轉載于:https://www.cnblogs.com/DarkValkyrie/p/11053352.html

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

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

相關文章

CF758 D. Ability To Convert 細節處理字符串

link 題意&#xff1a;給定進制數n及一串數字,問在此進制下這串數能看成最小的數&#xff08;10進制&#xff09;是多少&#xff08;如HEX下 1|13|11 475&#xff09; 思路&#xff1a;此題要仔細思考細節。首先要想使數最小那么必定有個想法是使低位的數盡可能大即位數盡可能…

java 可能尚未初始化變量,java - 局部變量“變量”可能尚未初始化-Java - 堆棧內存溢出...

我得到這個錯誤。線程“主”中的異常java.lang.Error&#xff1a;未解決的編譯問題&#xff1a;rgb2無法解析為變量它總是導致錯誤的rgb2數組。 如何解決這個問題呢&#xff1f;BufferedImage img1 ImageIO.read(file1);BufferedImage img2 ImageIO.read(file2);int w img1.…

leetcode1249. 移除無效的括號(棧)

給你一個由 ‘(’、’)’ 和小寫字母組成的字符串 s。 你需要從字符串中刪除最少數目的 ‘(’ 或者 ‘)’ &#xff08;可以刪除任意位置的括號)&#xff0c;使得剩下的「括號字符串」有效。 請返回任意一個合法字符串。 有效「括號字符串」應當符合以下 任意一條 要求&…

軟件工程——個人課程總結

軟件工程&#xff0c;我就是沖著軟件這兩個字來的&#xff0c;開始我覺得我們大多數人也是這樣的&#xff0c;能開發一款屬于自己的軟件應該是我們人生中的第一個小目標八&#xff0c;在上學期學完java語言后&#xff0c;我們自認為自己已經具備了開發一款小軟件的能力&#xf…

規則網絡_實用的網絡可訪問性規則

規則網絡by Tiago Romero Garcia蒂亞戈羅梅羅加西亞(Tiago Romero Garcia) 實用的網絡可訪問性規則 (Pragmatic rules of web accessibility that will stick to your mind) I first started to work with web accessibility back in 2015, at an American retail giant. It h…

8-python自動化-day08-進程、線程、協程篇

本節內容 主機管理之paramiko模塊學習 進程、與線程區別python GIL全局解釋器鎖線程語法join線程鎖之Lock\Rlock\信號量將線程變為守護進程Event事件 queue隊列生產者消費者模型Queue隊列開發一個線程池進程語法進程間通訊進程池 轉載&#xff1a;  http://www.cnblogs.co…

部署HDFS HA的環境

> 環境架構部署規劃&#xff1a; bigdata1 NameNode ResourceManager Zookeeper JournalNode failOverController bigdata2 NameNode ResourceManager Zookeeper JournalNode failOverController bigdata3 DataNode NodeManager Zookeeper bigdata4 DataNode NodeManager &g…

php layui 框架,Thinkphp5+Layui高顏值內容管理框架

Thinkphp5Layui高顏值內容管理框架TP5Layui高顏值內容管理框架&#xff0c;新增API模塊Thinkphp5Layui響應式后臺權限管理系統專注打造好用的框架&#xff0c;極速開發&#xff0c;高效靈活&#xff0c;從架構上兼顧系統復雜度的迭代與需求多變。代碼結構清晰&#xff0c;接口開…

leetcode657. 機器人能否返回原點

在二維平面上&#xff0c;有一個機器人從原點 (0, 0) 開始。給出它的移動順序&#xff0c;判斷這個機器人在完成移動后是否在 (0, 0) 處結束。 移動順序由字符串表示。字符 move[i] 表示其第 i 次移動。機器人的有效動作有 R&#xff08;右&#xff09;&#xff0c;L&#xff…

在Angular專家Dan Wahlin的免費33部分課程中學習Angular

According to the Stack Overflow developer survey 2018, Angular is one of the most popular frameworks/libraries among professional developers. So learning it increases your chances of getting a job as a web developer significantly.根據2018年Stack Overflow開…

select查詢語句執行順序

查詢中用到的關鍵詞主要包含六個&#xff0c;并且他們的順序依次為 select--from--where--group by--having--order by 其中select和from是必須的&#xff0c;其他關鍵詞是可選的&#xff0c;這六個關鍵詞的執行順序 與sql語句的書寫順序并不是一樣的&#xff0c;而是按照下面的…

Python的Virtualenv(虛擬環境)的使用(Windows篇)2

Python的Virtualenv(虛擬環境)的使用&#xff08;Windows篇&#xff09; 2018年04月13日 11:35:01 D_FallMoon 閱讀數 771 版權聲明&#xff1a;版權所有 裝載請注明 …

Loadrunner常用15種的分析點

1.Vusers&#xff1a;提供了生產負載的虛擬用戶運行狀態的相關信息&#xff0c;可以幫助我們了解負載生成的結果。 2.Rendezvous&#xff08;負載過程中集合點下的虛擬用戶&#xff09;&#xff1a;當設置集合點后會生成相關數據&#xff0c;反映了隨著時間的推移各個時間點上并…

leetcode1442. 形成兩個異或相等數組的三元組數目

給你一個整數數組 arr 。 現需要從數組中取三個下標 i、j 和 k &#xff0c;其中 (0 < i < j < k < arr.length) 。 a 和 b 定義如下&#xff1a; a arr[i] ^ arr[i 1] ^ … ^ arr[j - 1] b arr[j] ^ arr[j 1] ^ … ^ arr[k] 注意&#xff1a;^ 表示 按位異…

matlab的獨立樣本t檢驗,獨立雙樣本檢驗的Matlab實現

Independent two-samples test in MatlabYang Runhuai1楊潤懷(1987-)&#xff0c;男&#xff0c;講師&#xff0c;生物3D打印Zhang Zhen1Yang Siqiao1Liang Zhen1梁振(1981-)&#xff0c;男&#xff0c;副教授&#xff0c;臨床工程1、Life Science School, Anhui medical unive…

bi可視化工具_適用于您的BI解決方案的最佳數據可視化和Web報告工具

bi可視化工具通過智能數據分析使復雜變得簡單 (Making the complex simple with smart data analysis) It is hard to overestimate the value of insightful analytics nowadays. All business processes have become data-driven: marketing, accounting, human resources, c…

Python os 屬性(便于跨平臺開發)

1、有助于跨平臺開發的os模塊屬性 >>> tmp os.linesep >>> tmp \n >>> tmp os.sep >>> tmp / >>> tmp os.pathsep >>> tmp : >>> tmp os.curdir >>> tmp . >>> tmp os.pardir >&g…

第一個Hibernate項目

一、構建Hibernate項目 1.新建Java項目HibernateDemo1 2.導入Hibernate下的jar包&#xff08;lib->required下的所有jar包&#xff09;jdbc驅動包 3.導入hibernate.cfg.xml文件到src目錄下&#xff08;在Hibernate文件目錄中搜索*.cfg.xml&#xff09; 配置該文件如下&#…

前端面試常見邏輯題收集及分析

前端面試中常出現一些有趣的邏輯題,初見的時候有可能會手足無措,但實際多看幾個題之后就會有一定的思考邏輯,有種打通任督二脈的感覺.以下是我個人面試經歷以及網絡上收集來的一些經典題目. 題目: 1.現有一個裝有無限水的池塘,你手里有兩個空壺,一個容積為6升,一個為5升,請問你…

php htaccess實現緩存,使用.htaccess進行瀏覽器圖片文件緩存,_PHP教程

使用.htaccess進行瀏覽器圖片文件緩存&#xff0c;對于圖片類網站&#xff0c;每次打開頁面都要重新下載圖片&#xff0c;慢不說&#xff0c;還非常浪費流量。這時就需要用到緩存&#xff0c;強制瀏覽器緩存圖片文件緩存文件&#xff0c;提問網站訪問數度&#xff0c;減少流量消…