国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1021 石子歸并 (區間dp)

2019-11-08 02:01:11
字體:
來源:轉載
供稿:網友

1021 石子歸并 基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級算法題 收藏 關注 N堆石子擺成一條線。現要將石子有次序地合并成一堆。規定每次只能選相鄰的2堆石子合并成新的一堆,并將新的一堆石子數記為該次合并的代價。計算將N堆石子合并成一堆的最小代價。

例如: 1 2 3 4,有不少合并方法 1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19) 1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24) 1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)

括號里面為總代價可以看出,第一種方法的代價最低,現在給出n堆石子的數量,計算最小合并代價。 Input 第1行:N(2 <= N <= 100) 第2 - N + 1:N堆石子的數量(1 <= A[i] <= 10000) Output 輸出最小合并代價 Input示例 4 1 2 3 4 Output示例 19

題解:區間dp,我們求一個大的區間的最小值,可以先求小區間,然后一點一點變成大區間

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define M 110#define INF 0x3f3f3f3fint dp[M][M], sum[M], a[M];int main(){ int n; while(scanf("%d", &n) != EOF) { sum[0] = 0; memset(dp, INF, sizeof(dp)); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); dp[i][i] = 0; sum[i] = sum[i-1] + a[i]; } for(int len=2; len<=n; len++) { for(int i=1; i+len-1<=n; i++) { for(int j=i+1; j<i+len; j++) { if(dp[i][i+len-1] > dp[i][j-1]+dp[j][i+len-1]+sum[i+len-1]-sum[i-1]) dp[i][i+len-1] = dp[i][j-1]+dp[j][i+len-1]+sum[i+len-1]-sum[i-1]; } } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普格县| 海淀区| 玉龙| 屯昌县| 博客| 三亚市| 宁南县| 武陟县| 边坝县| 祁连县| 新野县| 竹北市| 阿城市| 余姚市| 镇平县| 临潭县| 龙陵县| 托里县| 巨鹿县| 纳雍县| 来凤县| 中卫市| 囊谦县| 安塞县| 巴马| 洪洞县| 佛学| 尤溪县| 睢宁县| 武宣县| 宜丰县| 宜良县| 宁津县| 马关县| 石首市| 高淳县| 阳城县| 湛江市| 台州市| 黑河市| 香河县|