一本通1573分離與合體

2022-05-08 02:03:10 字數 1960 閱讀 9094

時間限制: 1000 ms         記憶體限制: 524288 kb

題目描述

經過在機房裡數日的切磋,lyd 從杜神牛那裡學會了分離與合體,出關前,杜神牛給了他乙個測試……

杜神牛造了 n 個區域,他們緊鄰著排成一行,編號 1..n。在每個區域裡都放著一把 oi 界的密鑰匙,每一把都有一定的價值,lyd 當然想得到他們了。然而杜神牛規定 lyd 不能一下子把他們全部拿走,而是每次只可以拿一把。為了盡快得到所有密鑰匙,lyd 自然就用上了剛學的分離與合體特技。

一開始 lyd 可以選擇 1..n-1中的任何乙個區域進入,我們不妨把這個區域記為 kk。進入後 lyd 會在 k 區域發生分離,從而分離成兩個小 lyd。分離完成的同時會有一面牆在k區域和 k+1區域間公升起,從而把 1..k和 k+1..n 阻斷成兩個獨立的區間,並在各自區間內任選除區間末尾之外(即從 1..k−1 和 k+1..n−1中選取)的任意乙個區域再次發生分離,這樣就有了四個小小 lyd……重複以上所敘述的分離,直到每個小 lyd 發現自己所在的區間只剩下了乙個區域,那麼他們就可以抱起自己夢寐以求的 oi 密鑰匙。

但是 lyd 不能就分成這麼多個個體存在於世界上,這些小 lyd 還會再合體,合體的小 lyd 所在區間中間的牆會消失。合體會獲得 ((合併後所在區間左右端區域裡密鑰匙價值之和)×(之前分離的時候所在區域的密鑰匙價值))。

例如,lyd 曾在 1..3 區間中的 2 號區域分離成為 1..2 和 3..3 兩個區間,合併時獲得的價值就是 (( 1 號密鑰匙價值 +3 號密鑰匙價值)×( 2 號密鑰匙價值))。

lyd 請你程式設計求出最終可以獲得的最大總價值,並按照分離階段從前到後,區域從左到右的順序,輸出發生分離區域編號。若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)。

例如先列印一分為二的區域,然後從左到右列印二分為四的分離區域,然後是四分為八的……

輸入格式

第一行乙個正整數 n 第二行 nn 個用空格分開的正整數 ai​,表示 1..n 區域裡每把密鑰匙的價值。

輸出格式

第一行乙個數,表示獲得的最大價值

第二行按照分離階段從前到後,區域從左到右的順序,輸出發生分離區域編號。若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)。

樣例樣例輸入

7

1 2 3 4 5 6 7

樣例輸出

238

1 2 3 4 5 6

資料範圍與提示

對於 20% 的資料,n≤10;

對於 40% 的資料,n≤50;

對於 100% 的資料,n,ai​≤300,保證運算過程和結果不超過 32 位正整數範圍。

sol:這題面好多廢話,其實不難,但是輸出方案時不是dfs一樣遞迴輸出,要想bfs一樣

#include using

namespace

std;

const

int n=305

;int

n,a[n];

intdp[n][n],dp_road[n][n];

struct

record

;inline

void

output()

);

while(!queue.empty())

);if(tmp.road+1

1,tmp.r,dp_road[tmp.road+1

][tmp.r]});

}return;}

intmain()}}

printf(

"%d\n

",dp[1

][n]);

output();

return0;

}/*input

71 2 3 4 5 6 7

output

2381 2 3 4 5 6

*/

view code

一本通 1050 騎車與走路

1050 騎車與走路 時間限制 1000 ms 記憶體限制 65536 kb 提交數 54292 通過數 30710 題目描述 在清華校園裡,沒有自行車,上課辦事會很不方便。但實際上。並非去辦任何事情都是騎車快,因為騎車總要找車 開鎖 停車 鎖車等,這要耽誤一些時間。假設找到自行車,開鎖並騎上自行車...

1050 騎車與走路 資訊學一本通(c )

時間限制 1000 ms 記憶體限制 65536 kb 提交數 21833 通過數 12577 題目描述 在清華校園裡,沒有自行車,上課辦事會很不方便。但實際上。並非去辦任何事情都是騎車快,因為騎車總要找車 開鎖 停車 鎖車等,這要耽誤一些時間。假設找到自行車,開鎖並車上自行車的時間為27秒 停車鎖...

資訊學奧賽一本通,綜合應用 12分數求和

資訊學奧賽一本通,綜合應用 12分數求和 include using namespace std long long a 12 b 12 a陣列用來存分子,b陣列用來存分母 這個函式用來找出兩個數的最大公約數,保證a b intf1 int a,int b 這個函式是遞迴函式 迴圈模擬也可以 從陣列...