題解 石子合併

2022-04-29 22:39:12 字數 1043 閱讀 4394

區間dp模板題

題目鏈結

題目要求乙個環中的最小價值和最大價值(如題)。

首先,我們段環成鏈,即開兩倍的空間,i與i+n對應。

用字首和預處理出任意區間中的和。

接下來,我們列舉段環的位置。

設dp[i][j]是i到j合併的最小價值。

顯然我們可以列舉k作為段環的點,方程即為:

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+dis(i,j)),

就是將i到k的最小價值和k+1到j的最小價值與i到j的石子數量總和加起來,取最小。

設f[i][j]是i到j合併的最大價值,同理。

我們列舉i到j,並在i到j之間列舉k作為斷點。

每次dp即可。

最後需要分別求一遍最大最小值。

**:

#include#include

#define maxn 2147483647#include

using

namespace

std;

int n,sum[50000

];int a[50000

],minn,maxn;

int f[500][500];//

maxint dp[500][500];//

mininline int dis(int i,int j)

inline

void read(int &x)

while(ch>='

0'&&ch<='9'

) x=s*w;

}int

main()

for(int i=1;i<=(n<<1);i++)

sum[i]=sum[i-1]+a[i];

for(int p=1;p)}}

minn=maxn;

maxn=-maxn;

for(int i=1;i<=n;i++)

printf(

"%d\n%d

",minn,maxn);

return0;

}

view code

題解 石子合併

有n nn堆石子排成一條直線,每堆石子有一定的重量。現在要合併這些石子成為一堆石子,但是每次只能合併相鄰的兩堆。每次合併需要消耗一定的體力,該體力為所合併的兩堆石子的重量之和。問最少需要多少體力才能將n堆石子合併成一堆石子?假設只有2堆石子,顯然只有1種合併方案。不管怎麼合併,總之最後總會歸結為2堆...

石子合併題解1

分析 首先我們可以發現這跟以往的線性dp不同,從每一步的點到點成了兩條線的轉移,所以在與以往的思考上有很大不同,首先若i,j兩堆可以合併那麼i j之間的所有石子都以合併,即i,j合併與i至k,和k 1至i有關。狀態 dp i j 表示左端點為i,右端點為j的區間合併花費最小值。狀態轉移方程 dp r...

SDOI2008 石子合併 題解

題面 garsiawachs演算法專門解決石子合併問題 設乙個序列是a 0.n 1 每次尋找最小的乙個滿足a k 1 a k 1 的k,那麼我們就把a k 與a k 1 合併,並向前尋找乙個第乙個超過他們的和的數,把這個數插入到他後面 include define inc i,a,b for reg...