演算法提高 合併石子
時間限制: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希望知...