【網絡流 圖論建模 最大權閉合子圖】 [六省聯考 2017] 壽司餐廳

題目描述:

P3749 [六省聯考 2017] 壽司餐廳

題目描述

Kiana 最近喜歡到一家非常美味的壽司餐廳用餐。

每天晚上,這家餐廳都會按順序提供 n n n 種壽司,第 i i i 種壽司有一個代號 a i a_i ai? 和美味度 d i , i d_{i, i} di,i?,不同種類的壽司有可能使用相同的代號。每種壽司的份數都是無限的,Kiana 也可以無限次取壽司來吃,但每種壽司每次只能取一份,且每次取走的壽司必須是按餐廳提供壽司的順序連續的一段,即 Kiana 可以一次取走第 1 , 2 1, 2 1,2 種壽司各一份,也可以一次取走第 2 , 3 2, 3 2,3 種壽司各一份,但不可以一次取走第 1 , 3 1, 3 1,3 種壽司。

由于餐廳提供的壽司種類繁多,而不同種類的壽司之間相互會有影響:三文魚壽司和魷魚壽司一起吃或許會很棒,但和水果壽司一起吃就可能會肚子痛。因此,Kiana 定義了一個綜合美味度 d i , j ( i < j ) d_{i, j} \ (i < j) di,j??(i<j),表示在一次取的壽司中,如果包含了餐廳提供的從第 i i i 份到第 j j j 份的所有壽司,吃掉這次取的所有壽司后將獲得的額外美味度。由于取壽司需要花費一些時間,所以我們認為分兩次取來的壽司之間相互不會影響。注意在吃一次取的壽司時,不止一個綜合美味度會被累加,比如若 Kiana 一次取走了第 1 , 2 , 3 1, 2, 3 1,2,3 種壽司各一份,除了 d 1 , 3 d_{1, 3} d1,3? 以外, d 1 , 2 , d 2 , 3 d_{1, 2}, d_{2, 3} d1,2?,d2,3? 也會被累加進總美味度中。

神奇的是,Kiana 的美食評判標準是有記憶性的,無論是單種壽司的美味度,還是多種壽司組合起來的綜合美味度,在計入 Kiana 的總美味度時都只會被累加一次。比如,若 Kiana 某一次取走了第 1 , 2 1, 2 1,2 種壽司各一份,另一次取走了第 2 , 3 2, 3 2,3 種壽司各一份,那么這兩次取壽司的總美味度為 d 1 , 1 + d 2 , 2 + d 3 , 3 + d 1 , 2 + d 2 , 3 d_{1, 1} + d_{2, 2} + d_{3, 3} + d_{1, 2} + d_{2, 3} d1,1?+d2,2?+d3,3?+d1,2?+d2,3?,其中 d 2 , 2 d_{2, 2} d2,2? 只會計算一次。

奇怪的是,這家壽司餐廳的收費標準很不同尋常。具體來說,如果 Kiana 一共吃過了 c ( c > 0 ) c \ (c > 0) c?(c>0) 代號為 x x x 的壽司,則她需要為這些壽司付出 m x 2 + c x mx^2 + cx mx2+cx 元錢,其中 m m m 是餐廳給出的一個常數。

現在 Kiana 想知道,在這家餐廳吃壽司,自己能獲得的總美味度(包括所有吃掉的單種壽司的美味度和所有被累加的綜合美味度)減去花費的總錢數的最大值是多少。由于她不會算,所以希望由你告訴她。

輸入格式

第一行包含兩個正整數 n , m n, m n,m,分別表示這家餐廳提供的壽司總數和計算壽司價格中使用的常數。
第二行包含 n n n 個正整數,其中第 k k k 個數 a k a_k ak? 表示第 k k k 份壽司的代號。
接下來 n n n 行,第 i i i 行包含 n ? i + 1 n - i + 1 n?i+1 個整數,其中第 j j j 個數 d i , i + j ? 1 d_{i, i+j-1} di,i+j?1? 表示吃掉壽司能獲得的相應的美味度,具體含義見問題描述。

輸出格式

輸出共一行包含一個正整數,表示 Kiana 能獲得的總美味度減去花費的總錢數的最大值。

輸入輸出樣例 #1

輸入 #1

3 1
2 3 2
5 -10 15
-10 15
15

輸出 #1

12

輸入輸出樣例 #2

輸入 #2

5 0
1 4 1 3 4
50 99 8 -39 30
68 27 -75 -32
70 24 72
-10 81
-95

輸出 #2

381

輸入輸出樣例 #3

輸入 #3

10 1
5 5 4 4 1 2 5 1 5 3
83 91 72 29 22 -5 57 -14 -36 -3
-11 34 45 96 32 73 -1 0 29
-48 68 44 -5 96 66 17 74
88 47 69 -9 2 25 -49
86 -9 -77 62 -10 -30
2 40 95 -74 46
49 -52 2 -51
-55 50 -44
72 22
-68

輸出 #3

1223

說明/提示

樣例解釋 1

在這組樣例中,餐廳一共提供了 3 3 3 份壽司,它們的代號依次為 a 1 = 2 , a 2 = 3 , a 3 = 2 a_1 = 2, a_2 = 3, a_3 = 2 a1?=2,a2?=3,a3?=2,計算價格時的常數 m = 1 m = 1 m=1

在保證每次取壽司都能獲得新的美味度的前提下,Kiana 一共有 14 14 14 種不同的吃壽司方案。以下列出其中幾種:

  1. Kiana 一個壽司也不吃,這樣她獲得的總美味度和花費的總錢數都是 0 0 0,兩者相減也是 0 0 0
  2. Kiana 只取 1 1 1 次壽司,且只取第 1 1 1 個壽司,即她取壽司的情況為 { [ 1 , 1 ] } \{[1, 1]\} {[1,1]},這樣獲得的總美味度為 5 5 5,花費的總錢數為 1 × 2 2 + 1 × 2 = 6 1 \times 2^2 + 1 \times 2 = 6 1×22+1×2=6,兩者相減為 ? 1 -1 ?1
  3. Kiana 取 2 2 2 次壽司,第一次取第 1 , 2 1, 2 1,2 個壽司,第二次取第 2 , 3 2, 3 2,3 個壽司,即她取壽司的情況為 { [ 1 , 2 ] , [ 2 , 3 ] } \{[1, 2], [2, 3]\} {[1,2],[2,3]},這樣獲得的總美味度為 5 + ( ? 10 ) + 15 + ( ? 10 ) + 15 = 15 5 + (-10) + 15 + (-10) + 15 = 15 5+(?10)+15+(?10)+15=15,花費的總錢數為 ( 1 × 2 2 + 2 × 2 ) + ( 1 × 3 2 + 1 × 3 ) = 20 (1 \times 2^2 + 2 \times 2) + (1 \times 3^2 + 1 \times 3) = 20 (1×22+2×2)+(1×32+1×3)=20,兩者相減為 ? 5 -5 ?5
  4. Kiana 取 2 2 2 次壽司,第一次取第 1 1 1 個壽司,第二次取第 3 3 3 個壽司,即她取壽司的情況為 { [ 1 , 1 ] , [ 3 , 3 ] } \{[1, 1], [3, 3]\} {[1,1],[3,3]},這樣獲得的總美味度為 5 + 15 = 20 5 + 15 = 20 5+15=20,花費的總錢數為 1 × 2 2 + 2 × 2 = 8 1 \times 2^2 + 2 \times 2 = 8 1×22+2×2=8,兩者相減為 12 12 12

14 14 14 種方案中,惟一的最優方案是列出的最后一種方案,這時她獲得的總美味度減去花費的總錢數的值最大為 12 12 12

數據范圍

對于所有數據,保證 ? 500 ≤ d i , j ≤ 500 -500 \leq d_{i, j} \leq 500 ?500di,j?500

數據的一些特殊約定如下表:

Case # n n n a i a_i ai? m m m附加限制
1 ≤ 2 \leq 2 2 ≤ 30 \leq 30 30 = 0 = 0 =0-
2 ≤ 2 \leq 2 2 ≤ 30 \leq 30 30 = 1 = 1 =1-
3 ≤ 3 \leq 3 3 ≤ 30 \leq 30 30 = 0 = 0 =0-
4 ≤ 3 \leq 3 3 ≤ 30 \leq 30 30 = 1 = 1 =1-
5 ≤ 5 \leq 5 5 ≤ 30 \leq 30 30 = 0 = 0 =0-
6 ≤ 5 \leq 5 5 ≤ 30 \leq 30 30 = 1 = 1 =1-
7 ≤ 10 \leq 10 10 ≤ 30 \leq 30 30 = 0 = 0 =0所有的 a i a_i ai? 相同
8 ≤ 10 \leq 10 10 ≤ 30 \leq 30 30 = 1 = 1 =1-
9 ≤ 15 \leq 15 15 ≤ 30 \leq 30 30 = 0 = 0 =0所有的 a i a_i ai? 相同
10 ≤ 15 \leq 15 15 ≤ 30 \leq 30 30 = 1 = 1 =1-
11 ≤ 30 \leq 30 30 ≤ 1000 \leq 1000 1000 = 0 = 0 =0所有的 a i a_i ai? 相同
12 ≤ 30 \leq 30 30 ≤ 30 \leq 30 30 = 0 = 0 =0所有的 a i a_i ai? 相同
13 ≤ 30 \leq 30 30 ≤ 1000 \leq 1000 1000 = 0 = 0 =0-
14 ≤ 30 \leq 30 30 ≤ 1000 \leq 1000 1000 = 1 = 1 =1-
15 ≤ 50 \leq 50 50 ≤ 1000 \leq 1000 1000 = 0 = 0 =0所有的 a i a_i ai? 相同
16 ≤ 50 \leq 50 50 ≤ 30 \leq 30 30 = 0 = 0 =0所有的 a i a_i ai? 相同
17 ≤ 50 \leq 50 50 ≤ 1000 \leq 1000 1000 = 0 = 0 =0-
18 ≤ 50 \leq 50 50 ≤ 1000 \leq 1000 1000 = 1 = 1 =1-
19 ≤ 100 \leq 100 100 ≤ 1000 \leq 1000 1000 = 0 = 0 =0-
20 ≤ 100 \leq 100 100 ≤ 1000 \leq 1000 1000 = 1 = 1 =1-

在讀題的過程中,我們不難發現題目中的幾個量之間存在依賴關系,且這些依賴關系構成了一張最大權閉合子圖,再結合題目給的數據范圍,我們不難想到這道題可以利用網絡流去解決。

最大權閉合子圖在網絡流中是一個常見的模型:
有若干個物品,每種物品有一個可正可負的價值 v v v ,選取了物品就意味著獲得了價值。
物品之間有限制關系: x → y x→y xy 表示若要選擇物品 x x x 則必須選擇物品 y y y
對于這類問題,我們考慮用最小割去解決:
我們有源點s,匯點t。 源點向每個點都建邊,每個點都向匯點建邊。若割掉源點的邊則認為不選當前點,若割掉當前點向匯點的連邊則認為選擇當前點。
那么具體連邊要怎么連呢?
如果當前點的價值v為正數,那么讓答案加上當前點的價值,并且讓當前點和源點連容量為v的邊
如果當前點的價值v為負數,那么讓當前點和匯點連容量為-v的邊。
最小割就是在這個最大權閉合子圖上的最大流。

那么答案就是 a n s ? m a x f l o w ans-maxflow ans?maxflow

好,那么回歸這個題。
我們將每一個 d i , j d_{i,j} di,j?都看做一個點,價值就是他本身的值。
且這些點根點之間都有依賴關系:若想選 d i , j d_{i,j} di,j?,就必須選 d i , j ? 1 d_{i,j-1} di,j?1? d i + 1 , j d_{i+1,j} di+1,j?
只需要讓當前點向這兩個點連容量為正無窮的邊即可。
同時這個題還有一個壽司種類的限制,想要處理這個限制,最好的辦法就是把壽司種類也加入這個圖中,且他的價值為 ? m ? a [ i ] ? a [ i ] -m*a[i]*a[i] ?m?a[i]?a[i]
他跟 d i , i d_{i,i} di,i?存在限制: d i , i ? > a [ i ] d_{i,i}->a[i] di,i??>a[i]
且我們沒選一個壽司就要扣除他種類編號的價值,也就是令 d i , i d_{i,i} di,i?的價值再減去 a [ i ] a[i] a[i]
在這張圖上跑最大流即可求出答案。


#include<bits/stdc++.h>
using namespace std;const int N = 1e4+100,inf = 1e9+100;
struct Node{int y,Next,v;
}e[100*N];
int len = 1,Linkk[N];
int n,m;
int a[N],d[1000][1000];
int id[1000][1000],idx[10*N];
int ans = 0,cnt = 0;
int st,ed;
map < int , int > M;void Insert(int x,int y,int v){e[++len] = (Node){y,Linkk[x],v};Linkk[x] = len;e[++len] = (Node){x,Linkk[y],0};Linkk[y] = len;
}int de[N];bool bfs(){queue < int > q;for (int i = 1; i <= n; i++) de[i] = 0;de[st] = 1; q.push(st);while (q.size()){int x = q.front(); q.pop();for (int i = Linkk[x]; i; i = e[i].Next){int y = e[i].y;if (de[y] || e[i].v == 0) continue;de[y] = de[x]+1;if (y == ed) return 1;q.push(y);}}return 0;
}int dinic(int x,int re){if (x == ed) return re;int now = re;for (int i = Linkk[x]; i && re; i = e[i].Next){int y = e[i].y;if (e[i].v == 0 || de[y] != de[x]+1) continue;int k = dinic(y,min(e[i].v,re));if (k == 0) de[y] = 0;re-=k;e[i].v-=k; e[i^1].v+=k;}return now-re;
}void Work(){len = 1;cin>>n>>m;st = ++cnt; ed = ++cnt;for (int i = 1; i <= n; i++){cin>>a[i];if (!M[a[i]]) M[a[i]] = 1 , idx[a[i]] = ++cnt;}M.clear();for (int i = 1; i <= n; i++){if (M[a[i]]) continue;M[a[i]] = 1;if (m) Insert(idx[a[i]],ed,m*a[i]*a[i]);}for (int i = 1; i <= n; i++)for (int j = i; j <= n; j++){cin>>d[i][j],id[i][j] = ++cnt;int v = d[i][j];if (i == j){v = v-a[i];if (m) Insert(id[i][j],idx[a[i]],inf);}if (v > 0){ans+=v;Insert(st,id[i][j],v);}else Insert(id[i][j],ed,-v);}for (int i = 1; i <= n; i++)for (int j = i+1; j <= n; j++){int x = id[i][j] ,y ;if (i + 1 <= n) y = id[i+1][j],Insert(x,y,inf);y = id[i][j-1]; Insert(x,y,inf);}int maxf = 0;n = cnt;while (bfs()) maxf+=dinic(st,inf);cout<<ans-maxf<<endl;return; 
}int main(){ios::sync_with_stdio(false);cin.tie(0);int _ = 1; while (_--) Work();return 0;
}

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

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

相關文章

前端面試題(三):axios有哪些常用的方法

Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;用于瀏覽器和 Node.js 中發送 HTTP 請求。它提供了一些常用的方法來處理不同類型的請求。以下是 Axios 中常用的一些方法&#xff1a; 1. axios.get() 用于發送 GET 請求&#xff0c;從服務器獲取數據。 axios.get(/api/d…

python match case語法

學習路線&#xff1a;B站 普通的if判斷 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微調全流程指南

該文檔為LLaMA-Factory大模型微調提供了完整的技術指導&#xff0c;涵蓋了從環境搭建到模型訓練、推理和合并模型的全流程&#xff0c;適用于需要進行大模型預訓練和微調的技術人員。 一、docker 容器服務 請參考如下資料制作 docker 容器服務&#xff0c;其中&#xff0c;掛…

【HCIA】靜態綜合實驗練習筆記

實驗拓撲圖如下&#xff1a; 實驗配置思路如下&#xff1a; 1、網段劃分、配置IP地址 2、配置DHCP&#xff0c;使客戶端獲得ip地址 3、配置靜態明細路由&#xff0c;內網全網通 4、配置空接口防環 5、配置優先級&#xff0c;實現選路最佳 6、配置缺省路由&#xff0c;實現公網通…

大數據(4.5)Hive聚合函數深度解析:從基礎統計到多維聚合的12個生產級技巧

目錄 背景一、Hive聚合函數分類與語法1. 基礎聚合函數2. 高級聚合函數 二、6大核心場景與案例場景1&#xff1a;基礎統計&#xff08;SUM/COUNT&#xff09;場景2&#xff1a;多維聚合&#xff08;GROUPING SETS&#xff09;場景3&#xff1a;層次化聚合&#xff08;ROLLUP&…

RTOS基礎 -- NXP M4小核的RPMsg-lite與端點機制回顧

一、RPMsg-lite與端點機制回顧 在RPMsg協議框架中&#xff1a; Endpoint&#xff08;端點&#xff09; 是一個邏輯通信端口&#xff0c;由本地地址&#xff08;local addr&#xff09;、遠程地址&#xff08;remote addr&#xff09;和回調函數組成。每個消息都會發送到特定的…

NineData云原生智能數據管理平臺新功能發布|2025年3月版

本月發布 15 項更新&#xff0c;其中重點發布 3 項、功能優化 11 項、性能優化 1 項。 重點發布 基礎服務 - MFA 多因子認證 新增 MFA 多因子認證&#xff0c;提升賬號安全性。系統管理員開啟后&#xff0c;所有組織成員需綁定認證器&#xff0c;登錄時需輸入動態驗證碼。 數…

DAY 35 leetcode 202--哈希表.快樂數

題號202 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變不到 1。如果這個過程 結果為 1&a…

Maven+Spring實現后端開發

一、前置知識的介紹 1.Spring 輕量級的 DI / IoC 和 AOP 容器的開源框架 容器的開源框架網址&#xff1a;https://spring.io/projects/spring-framework 作用&#xff1a;可簡化管理創建和組裝對象之間的依賴關系 將controller----->service------->dao層的依賴配置…

解鎖界面設計密碼,打造極致用戶體驗

界面設計是對軟件、網站、移動應用等產品的用戶界面進行設計的過程&#xff0c;旨在為用戶提供美觀、易用、高效的交互體驗。以下是關于界面設計的一些主要方面&#xff1a; 一、設計原則 用戶中心原則&#xff1a;以用戶為中心&#xff0c;了解用戶的需求、期望、行為和習慣…

Joint Receiver Design for Integrated Sensing and Communications

摘要——在本文中&#xff0c;我們研究了集成感知與通信(ISAC)系統的聯合接收機設計&#xff0c;其中通信信號和目標回波信號同時被接收和處理&#xff0c;以在兩種功能之間實現平衡性能。特別地&#xff0c;我們提出了兩種設計方案來解決聯合感知和通信問題中的接收信號處理。…

DeepSeek接入飛書多維表格,效率起飛!

今天教大家把DeepSeek接入飛書表格使用。 準備工作&#xff1a;安裝并登錄飛書&#xff1b;可以準備一些要處理的數據&#xff0c;確保數據格式正確&#xff0c;如 Excel、CSV 等&#xff0c;也可直接存儲到飛書多維表格。 創建飛書多維表格&#xff1a;打開飛書&#xff0c;點…

【C語言入門】由淺入深學習指針 【第二期】

目錄 1. 指針變量為什么要有類型&#xff1f; 2. 野指針 2.1 未初始化導致的野指針 2.2 指針越界導致的野指針 2.3 如何規避野指針 3. 指針運算 3.1 指針加減整數 3.2 指針減指針 3.3 指針的關系運算 4. 二級指針 5. 指針數組 5.1 如何使用指針數組模擬二維數組 上…

OpenCV 圖形API(13)用于執行兩個矩陣(或圖像)逐元素乘法操作的函數mul()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 計算兩個矩陣的每個元素的縮放乘積。 mul函數計算兩個矩陣的逐元素乘積&#xff1a; dst ( I ) saturate ( scale ? src1 ( I ) ? src2 ( I ) ) …

人工智能混合編程實踐:C++調用封裝好的DLL進行圖像超分重建

人工智能混合編程實踐:C++調用封裝好的DLL進行圖像超分重建 前言相關介紹C++簡介ONNX簡介ONNX Runtime 簡介**核心特點**DLL 簡介**核心特點****創建與使用****應用場景****優點與挑戰**圖像異常檢測簡介應用場景前提條件實驗環境項目結構C++調用封裝好的DLL進行圖像超分重建C…

Linux內核之高效緩沖隊列kfifo

一、先說FIFO 隊列是常見的一種數據結構&#xff0c;簡單看來就是一段數據緩存區&#xff0c;可以存儲一定量的數據&#xff0c;先存進來的數據會被先取出&#xff0c;First In Fist Out&#xff0c;就是FIFO。 FIFO主要用于緩沖速度不匹配的通信。 例如生產者&#xff08;數…

【面試篇】Kafka

一、基礎概念類 問題&#xff1a;請簡述 Kafka 是什么&#xff0c;以及它的主要應用場景有哪些&#xff1f; 答案&#xff1a;Kafka 是一個分布式流處理平臺&#xff0c;它以高吞吐量、可持久化、可水平擴展等特性而聞名。其主要應用場景包括&#xff1a; 日志收集&#xff1a…

解釋回溯算法,如何應用回溯算法解決組合優化問題?

一、回溯算法核心原理 回溯算法本質是暴力窮舉的優化版本&#xff0c;采用"試錯剪枝"策略解決問題。其核心流程如下&#xff1a; ?路徑構建&#xff1a;記錄當前選擇路徑?選擇列表&#xff1a;確定可用候選元素?終止條件&#xff1a;確定遞歸結束時機?剪枝優化…

Vue 學習隨筆系列二十二 —— 表格高度自適應

表格高度自適應 文章目錄 表格高度自適應1、方法一2、方法二 1、方法一 根據頁面元素計算各自占比 <template><div class"main"><div class"query-form" ref"Query"><QueryFormref"QueryForm"query"query&q…