算法提高 合并石子
---恢復(fù)內(nèi)容開始---
算法提高 合并石子 ? 時間限制:2.0s ? 內(nèi)存限制:256.0MB 問題描述 在一條直線上有n堆石子,每堆有一定的數(shù)量,每次可以將兩堆相鄰的石子合并,合并后放在兩堆的中間位置,合并的費用為兩堆石子的總數(shù)。求把所有石子合并成一堆的最小花費。 輸入格式 輸入第一行包含一個整數(shù)n,表示石子的堆數(shù)。接下來一行,包含n個整數(shù),按順序給出每堆石子的大小 。 輸出格式 輸出一個整數(shù),表示合并的最小花費。 樣例輸入 5
1 2 3 4 5 樣例輸出 33 數(shù)據(jù)規(guī)模和約定 1<=n<=1000, 每堆石子至少1顆,最多10000顆。 #include <iostream> #include <cstdio> #include <vector> #include <queue> #include <map> #include <stack> #include <cstring> #include <algorithm> #include <cstdlib> #define FOR(i,x,n) for(long i=x;i<n;i++) #define ll long long int #define INF 0x3f3f3f3f3f3f3f3f #define MOD 1000000007 #define MAX_N 50005using namespace std;int m[1005][1005]; int a[1005];int main() {//freopen("input1.txt", "r", stdin);//freopen("data.out", "w", stdout);int N;ll sum=0;scanf("%d",&N);FOR(i,0,N){scanf("%d",&a[i]);m[i][i]=0;//sum+=a[i]; }FOR(i,1,N){FOR(jj,0,N-i){int j=jj+i;int minn=INF;int s=0;FOR(k,jj,j){s+=a[k];int t=m[jj][k]+m[k+1][j];if(t<minn){minn=t;}}s+=a[j];m[jj][j]=minn+s;}}printf("%d",m[0][N-1]);//fclose(stdin);//fclose(stdout);return 0; }
?
?
---恢復(fù)內(nèi)容結(jié)束---
轉(zhuǎn)載于:https://www.cnblogs.com/TWS-YIFEI/p/6557084.html
總結(jié)
- 上一篇: mysql 以数组的形式插入更新表
- 下一篇: pysam - 多种格式基因组数据(sa