信息學奧賽一本通 1570:【例 2】能量項鏈 | 1843:【06NOIP提高組】能量項鏈 | 洛谷 P1063 [NOIP 2006 提高組] 能量項鏈

【題目鏈接】

ybt 1570:【例 2】能量項鏈
ybt 1843:【06NOIP提高組】能量項鏈
洛谷 P1063 [NOIP 2006 提高組] 能量項鏈

【題目考點】

1. 動態規劃:區間動規
2. 環形序列

解決方法:破環為鏈
模板題:洛谷 P1880 [NOI1995] 石子合并

【解題思路】

本題與洛谷 P1880 [NOI1995] 石子合并十分類似,可以先做上題,而后做本題。
環形序列上的問題,首先進行破環為鏈,將長為n的輸入a序列變為長為 2 n 2n 2n的a序列。其中 a i + n = a i , 1 ≤ i ≤ n a_{i+n}=a_i,1\le i \le n ai+n?=ai?,1in
原環形序列為由n個珠子構成的環形序列。破環為鏈后得到的是由 2 n ? 1 2n-1 2n?1個珠子構成的線性序列。該線性序列為一個假想的 b b b序列, b b b序列的每個元素為一個珠子,第i顆珠子 d i d_i di?的頭標記為 a i a_i ai?,尾標記為 a i + 1 a_{i+1} ai+1?。最后第 2 n ? 1 2n-1 2n?1個珠子 b 2 n ? 1 b_{2n-1} b2n?1?的頭標記為 a 2 n ? 1 a_{2n-1} a2n?1?,尾標記為 a 2 n a_{2n} a2n?

1. 狀態定義
  • 階段:第i個珠子到第j個珠子,即b序列區間 [ i , j ] [i,j] [i,j]
  • 決策:合并哪兩個珠子
  • 策略:合并的方案
  • 策略集合:b序列區間 [ i , j ] [i,j] [i,j]的所有合并方案
  • 條件:獲得能量最大
  • 統計量:能量

狀態定義: d p i , j dp_{i,j} dpi,j?:b序列區間 [ i , j ] [i,j] [i,j]的所有合并方案中,獲得能量最大的方案所獲得的能量。
初始狀態:1顆珠子無法合并,獲得能量為0。因此 d p i , i = 0 dp_{i,i}=0 dpi,i?=0

2. 狀態轉移方程
  • 策略集合:b序列區間 [ i , j ] [i,j] [i,j]的所有合并方案
    根據最后一次將哪兩個珠子合并,來分割策略集合。

設存在分割點 k k k,將區間 [ i , j ] [i,j] [i,j]分割為區間 [ i , k ] [i,k] [i,k]與區間 [ k + 1 , j ] [k+1,j] [k+1,j]。自然 i ≤ k < j i\le k < j ik<j
要想求 d p i , j dp_{i,j} dpi,j?

  • 先將b序列區間 [ i , k ] [i,k] [i,k]合并為一個珠子,獲得能量 d p i , k dp_{i,k} dpi,k?。得到珠子的頭標記為 b i b_i bi?的頭標記 a i a_i ai?,尾標記為 b k b_k bk?的尾標記 a k + 1 a_{k+1} ak+1?
  • 再將b序列區間 [ k + 1 , j ] [k+1,j] [k+1,j]合并為一個珠子,獲得能量 d p k + 1 , j dp_{k+1,j} dpk+1,j?。得到珠子的頭標記為 b k + 1 b_{k+1} bk+1?的頭標記 a k + 1 a_{k+1} ak+1?,尾標記為 b j b_j bj?的尾標記 a j + 1 a_{j+1} aj+1?
  • 而后再將這兩個珠子合并,獲得能量 a i ? a k + 1 ? a j + 1 a_i\cdot a_{k+1}\cdot a_{j+1} ai??ak+1??aj+1?

求出 d p i , j = d p i , k + d p k + 1 , j + a i ? a k + 1 ? a j + 1 dp_{i,j} = dp_{i,k}+dp_{k+1,j}+a_i\cdot a_{k+1}\cdot a_{j+1} dpi,j?=dpi,k?+dpk+1,j?+ai??ak+1??aj+1?
枚舉分割點 k k k的所有可能情況,求出每種情況下狀態的最大值。
狀態轉移方程為:
d p i , j = max ? { d p i , k + d p k + 1 , j + a i ? a k + 1 ? a j + 1 } , i ≤ k < j dp_{i,j} = \max\{dp_{i,k}+dp_{k+1,j}+a_i\cdot a_{k+1}\cdot a_{j+1}\}, i\le k < j dpi,j?=max{dpi,k?+dpk+1,j?+ai??ak+1??aj+1?},ik<j

3. 具體實現

由于求滿足條件的最大值,dp數組初值應該為很小的值。由于所有可能的狀態值都是非負整數,因此dp數組初值可以為0。
對于長為1的區間的狀態,1個珠子無法合并獲得能量,因此 d p i , i = 0 dp_{i,i}=0 dpi,i?=0
外層循環為區間長度len,len最小為2,最大為n。
內層循環為區間左端點i,i最小為1。由于破環為鏈后 b b b序列共有 2 n ? 1 2n-1 2n?1個元素,i最大時,區間右端點 i + l e n ? 1 i+len-1 i+len?1 2 n ? 1 2n-1 2n?1,因此 i + l e n ? 1 < 2 n i+len-1<2n i+len?1<2n
取區間右端點 j = i + l e n ? 1 j=i+len-1 j=i+len?1,在 i ≤ k < j i\le k <j ik<j范圍內枚舉分割點 k k k,執行狀態轉移方程。
最后,枚舉 b b b序列上所有長為 n n n的區間,包括 [ 1 , n ] , [ 2 , n + 1 ] , . . . , [ n ? 1 , 2 n ? 2 ] , [ n , 2 n ? 1 ] [1,n], [2, n+1], ..., [n-1, 2n-2], [n, 2n-1] [1,n],[2,n+1],...,[n?1,2n?2],[n,2n?1],即 [ i , i + n ? 1 ] , 1 ≤ i ≤ n [i, i+n-1], 1\le i \le n [i,i+n?1],1in。求出每個區間的狀態值 d p i , i + n ? 1 dp_{i, i+n-1} dpi,i+n?1?的最大值,即為合并環形序列上珠子能獲得的最大能量。

【題解代碼】

解法1:區間動規 破環為鏈
#include<bits/stdc++.h>
using namespace std;
#define N 205
int a[N], n, ans, dp[N][N];//dp[i][j]:第i珠子到第j珠子有聚合方案中,釋放的能量最大的方案的能量   
int main()
{cin >> n;for(int i = 1; i <= n; ++i){cin >> a[i];a[i+n] = a[i];}for(int len = 2; len <= n; ++len)//由于都是正整數,求最大值。dp初值為很小的值,可以為0。dp[i][i] = 0 {for(int i = 1; i+len-1 < 2*n; ++i){int j = i+len-1;for(int k = i; k < j; ++k)dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]); }}for(int i = 1; i <= n; ++i)ans = max(ans, dp[i][i+n-1]);cout << ans;return 0;
}
``

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

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

相關文章

旅游微信小程序制作指南

想創建旅游微信小程序嗎&#xff1f;知道旅游業企業怎么打造自己的小程序嗎&#xff1f;這里有零基礎小白也能學會的教程&#xff0c;教你快速制作旅游類微信小程序&#xff01; 旅游行業能不能開發微信小程序呢&#xff1f;答案是肯定的。微信小程序對旅游企業來說可是個寶&am…

Vue3+Vite中lodash-es安裝與使用指南

在 Vue 3 Vite 項目中安裝和使用 lodash-es 的詳細指南如下&#xff1a; 一、為什么選擇 lodash-es&#xff1f; ES 模塊支持&#xff1a;lodash-es 以原生 ES 模塊格式發布&#xff0c;支持現代構建工具的 Tree Shaking 按需加載&#xff1a;只引入需要的函數&#xff0c;顯…

法律模型選型

當然可以&#xff0c;以下是關于法律法規相關模型的技術選型調研建議&#xff0c;適合算法實習生從0入手&#xff0c;并能交付有深度的調研報告&#xff1a; 一、調研背景與目標 目標&#xff1a;調研用于處理法律法規類任務的大模型與技術方案&#xff0c;明確適合本團隊的模…

軟件工程專業的本科生應該具備哪些技能

軟件工程專業的本科生需要具備扎實的技術基礎、良好的開發流程認知和一定的軟技能&#xff0c;以適應軟件開發行業的需求。以下從技術技能、開發流程與工具、軟技能、實踐能力等維度整理核心技能清單&#xff0c;供參考&#xff1a; 一、核心技術技能 1. 編程語言 - 必學基礎語…

[Java 基礎]類,面向對象的藍圖

首先需要區分類和對象都是啥&#xff1f; 類&#xff1a;類是一個模板&#xff0c;它描述一類對象的行為和狀態&#xff0c;類這個概念更像是下定義&#xff0c;更像是模板&#xff08;橡皮泥膜具&#xff09;。 對象&#xff1a;對象&#xff08;不是女朋友&#xff09;是類…

selenium-自動更新谷歌瀏覽器驅動

1、簡介 selenium最初是一個自動化測試工具&#xff0c;而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript代碼的問題&#xff0c;因為有些網頁數據是通過JavaScript動態加載的。selenium本質是通過驅動瀏覽器&#xff0c;完全模擬瀏覽器的操作&#xff0c;比如輸入…

java從azure中讀取用戶信息

以下是用 Java 從 Azure AD 獲取用戶信息的完整實現方案&#xff0c;使用 Spring Boot 框架和 Microsoft 身份驗證庫 (MSAL)&#xff1a; 1. 添加 Maven 依賴 <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.…

C# 數據庫訪問與ORM框架全面指南:從ADO.NET到Entity Framework Core

在現代應用開發中&#xff0c;數據持久化是核心需求之一。作為.NET生態系統中的主力語言&#xff0c;C#提供了豐富多樣的數據庫訪問技術和工具。本文將全面探討C#中的數據庫訪問方式&#xff0c;重點介紹三種主流ORM&#xff08;對象關系映射&#xff09;框架&#xff1a;Entit…

day19 leetcode-hot100-37(二叉樹2)

104. 二叉樹的最大深度 - 力扣&#xff08;LeetCode&#xff09; 1.深度優先遍歷&#xff08;遞歸&#xff09;ps:不好理解&#xff0c;所以我一般不喜歡用遞歸 思路 典型算法&#xff0c;用遞歸求出高度&#xff0c;每次都是深度優先。 具體算法 /*** Definition for a bi…

【LLMs篇】13:LLaDA—大型語言擴散模型

欄目內容論文標題大型語言擴散模型 (Large Language Diffusion Models)核心思想提出LLaDA&#xff0c;一種基于擴散模型的LLM&#xff0c;通過前向掩碼和反向預測過程建模語言分布&#xff0c;挑戰自回歸模型&#xff08;ARM&#xff09;在LLM領域的主導地位&#xff0c;并展示…

Deepfashion2 數據集使用筆記

目錄 數據類別: 篩選類別數據: 驗證篩選前2個類別: Deepfashion2 的解壓碼 數據類別: 類別含義: Class idx類別名稱英文名稱0短上衣short sleeve top1長上衣long sleeve top2短外套short sleeve outwear3長外套long sleeve outwear4裙子skirt5褲子trousers6連衣裙dre…

Java并發編程哲學系列匯總

文章目錄 并發編程基礎并發編程進階并發編程實踐 并發編程基礎 Java并發編程基礎小結 Java線程池知識點小結 詳解JUC包下各種鎖的使用 并發編程利器Java CAS原子類全解 深入理解Java中的final關鍵字 Java并發容器深入解析&#xff1a;HashMap與ArrayList線程安全問題及解…

git 之 stash

一、git stash&#xff1a;臨時保存工作區修改 作用 將當前工作目錄和暫存區的未提交修改保存到棧中&#xff0c;并恢復工作區到上一次提交的干凈狀態。 適用場景&#xff1a; 臨時切換分支修復緊急 Bug拉取遠程代碼前清理工作區保存實驗性代碼避免生成無效提交 常用命令&am…

vxe-grid 雙擊行,打開expand的內容

1、官網api Vxe Table v4.6&#xff08;根據版本&#xff09; 要調用這個事件&#xff0c;雙擊單元格&#xff0c;我們打開type"expand"的內容 2、打開的事件toggleRowExpand 3、事件的說明 這個方法&#xff0c;會自動判斷當前展開的狀態&#xff0c;然后去觸發相…

Java Stream 高級實戰:并行流、自定義收集器與性能優化

一、并行流深度實戰&#xff1a;大規模數據處理的性能突破 1.1 并行流的核心應用場景 在電商用戶行為分析場景中&#xff0c;需要對百萬級用戶日志數據進行實時統計。例如&#xff0c;計算某時段內活躍用戶數&#xff08;訪問次數≥3次的用戶&#xff09;&#xff0c;傳統循環…

計算機系統結構-第5章-監聽式協議

監聽式協議******&#xff1a; 思想: 每個Cache除了包含物理存儲器中塊的數據拷貝之外&#xff0c;也保存著各個塊的共享狀態信息。 Cache通常連在共享存儲器的總線上&#xff0c;當某個Cache需要訪問存儲器時&#xff0c;它會把請求放到總線上廣播出去&#xff0c;其他各個C…

(c++)string的模擬實現

目錄 1.構造函數 2.析構函數 3.擴容 1.reserve(擴容不初始化) 2.resize(擴容加初始化) 4.push_back 5.append 6. 運算符重載 1.一個字符 2.一個字符串 7 []運算符重載 8.find 1.找一個字符 2.找一個字符串 9.insert 1.插入一個字符 2.插入一個字符串 9.erase 10…

學習筆記(24): 機器學習之數據預處理Pandas和轉換成張量格式[2]

學習筆記(24): 機器學習之數據預處理Pandas和轉換成張量格式[2] 學習機器學習&#xff0c;需要學習如何預處理原始數據&#xff0c;這里用到pandas&#xff0c;將原始數據轉換為張量格式的數據。 學習筆記(23): 機器學習之數據預處理Pandas和轉換成張量格式[1]-CSDN博客 下面…

LeetCode 2297. 跳躍游戲 VIII(中等)

題目描述 給定一個長度為 n 的下標從 0 開始的整數數組 nums。初始位置為下標 0。當 i < j 時&#xff0c;你可以從下標 i 跳轉到下標 j: 對于在 i < k < j 范圍內的所有下標 k 有 nums[i] < nums[j] 和 nums[k] < nums[i] , 或者對于在 i < k < j 范圍…

【前端】緩存相關

本知識頁參考&#xff1a;https://zhuanlan.zhihu.com/p/586060532 1. 概述 1.1 應用場景 靜態資源 場景&#xff1a;圖片、CSS、JS 文件等靜態資源實現&#xff1a;使用 HTTP 緩存控制頭&#xff0c;或者利用 CDN 進行邊緣緩存 數據緩存 場景&#xff1a;請求的返回結果實現…