藍橋杯 演算法提高 合併石子 (dp)

2021-07-28 12:30:46 字數 973 閱讀 2076

演算法提高 合併石子  

時間限制:2.0s   記憶體限制:256.0mb

問題描述

在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。

輸入格式

輸入第一行包含乙個整數n,表示石子的堆數。

接下來一行,包含n個整數,按順序給出每堆石子的大小 。

輸出格式

輸出乙個整數,表示合併的最小花費。

樣例輸入 5

1 2 3 4 5

樣例輸出 33

資料規模和約定

1<=n<=1000, 每堆石子至少1顆,最多10000顆。

分析:和矩陣連乘類似,dp求解,狀態方程:dp(i,j)=min(dp(i,k)+dp(k+1,j)+sum(i,j));  其中dp(i,j)表示從第i堆到第j堆的最小花費

90 分,執行超時

**如下:

#include#include#includeusing namespace std;

#define inf 2147483647

typedef long long ll;

const int maxn=1000+5;

int a[maxn];

int dp[maxn][maxn];

int sum[maxn][maxn];

int n;

int main()

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

dp[i][i]=0;

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

for(int len=2;len<=n;len++){ //長度

for(int i=1;i<=n-len+1;i++) //起點

{int j=i+len-1; //終點

dp[i][j]=inf;

for(int k=i;k

演算法提高 合併石子(DP)

問題描述 在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。輸入格式 輸入第一行包含乙個整數n,表示石子的堆數。接下來一行,包含n個整數,按順序給出每堆石子的大小 輸出格式 輸出乙個整數,表...

藍橋杯 石子合併

問題描述 在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。輸入格式 輸入第一行包含乙個整數n,表示石子的堆數。接下來一行,包含n個整數,按順序給出每堆石子的大小 輸出格式 輸出乙個整數,表...

藍橋杯 演算法提高 拿糖果 dp

演算法提高 拿糖果 時間限制 1.0s 記憶體限制 256.0mb 問題描述 媽媽給小b買了n塊糖!但是她不允許小b直接吃掉。假設當前有m塊糖,小b每次可以拿p塊糖,其中p是m的乙個不大於根號下m的質因數。這時,媽媽就會在小b拿了p塊糖以後再從糖堆裡拿走p塊糖。然後小b就可以接著拿糖。現在小b希望知...