1. 程式人生 > >石子合併(一) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆

石子合併(一) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆

#include <stdio.h>
#include <iostream>//狀態轉移方程:m(i, j) = min(m(i,k),m(k + 1,j)) + sum(i, j)(i <= k < j) 
#include <string.h>//區間型動態規劃 
using namespace std;//合併石子的每個階段必定是兩堆石子的合併 
int d[201], sum[200][200], m[200][200];//m[i][j] 表示從i到j的最優解
int mer(int n) {//上個階段到下個階段 (嘗試區間內所有石子合併方式,找出最優的兩堆石子合併方式) 
int t;

for(int i = 0; i < n; i++) {//將所有劃分好的區間(從i 到 j )的重量都求出了 
sum[i][i] = d[i]; 
for(int j = i + 1; j < n; j++) {
sum[i][j] = sum[i][j - 1] + d[j];
}
}
/*
//檢視動態規劃表格 
printf("sum[i][j]\n");
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%3d ", sum[i][j]);
}

putchar('\n');
}
*/
for(int i = 0; i < n; i++)m[i][i] = 0;//從i到i花費0 

for(int len = 2; len <= n; len++){//len控制所求區間範圍,即控制區間長度
for(int i = 0; i < n - len + 1; i++){
int j = i + len - 1;
m[i][j] = m[i][i] + m[i + 1][j];
for(int k = i + 1; k < j; k++){//計算從i到j堆石子合併的最小總代價 
t = m[i][k] + m[k + 1][j];
if(m[i][j] > t)m[i][j] = t;
}
m[i][j] += sum[i][j];
}
}
/* 
//檢視動態規劃表格 
printf("m[i][j]\n");

for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%3d ", m[i][j]);
}

putchar('\n');
}
*/ 
return m[0][n - 1];
}
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = 0; i < n; i++)scanf("%d", &d[i]);
printf("%d\n", mer(n));
}
}

相關推薦

兩點距離 時間限制3000 ms | 記憶體限制65535 KB 難度1 描述 輸入兩點座標X1,Y1,X2,Y2(0

#include<stdio.h>#include<math.h>int main(void){int N;float a,b,c,d,result;scanf("%d",&N);          /*表示有多少組的資料要進行計算*/get

素數距離問題 時間限制3000 ms | 記憶體限制65535 KB 難度2 描述 現在給出你一些數要求你寫出一個程式輸出這些整數相鄰最近的素數並輸出其相距長度如果左右等距離長度素數

個人理解:判斷輸入的數是不是輸入只要判斷一個數i從2開始到到i*i小於等於輸入的這個數,對於0,1要直接輸出來0,然後找到左右的兩個素數進行比較大小後打印出即可 #include<stdio.h> #include<string.h>#inclu

月餅 (25) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述 月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量、總售價、以及市場的最大需 求量,請你計算可以獲得的最大收益是多少。 注意:銷售時允許取出一部分庫存。樣例給出的情形是這樣的:假如我們有3種月餅,其庫存量分別為18

組個最小數 (20) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述 給定數字0-9各若干個。你可以以任意順序排列這些數字,但必須全部使用。目標是使得最後得到的數儘可能小(注意0不能做首位)。例如: 給定兩個0,兩個1,三個5,一個8,我們得到的最小的數就是10015558。 現給定數字,請編寫程式輸出能夠組成的最小的數。

程式執行時間(15) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述 要獲得一個C語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock()函式,可以捕捉從程式開始執行到clock()被呼叫時所 耗費的時間。這個時間單位是clock tick,即“時鐘打點”。同時還有一個常數CLK_TCK,給出了機器時鐘每秒

福爾摩斯的約會 (20) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述 大偵探福爾摩斯接到一張奇怪的字條:“我們約會吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大偵探很 快就明白了,字條上奇怪的亂碼實際上就是約會的時間“星期四 14:04”,因

科學計數法 (20) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述 科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表示式[+-][1-9]"."[0-9]+E[+-][0-9]+,即數字的整數部分 只有1位,小數部分至少有1位,該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科學計數法的格式給出

人口普查(20) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。 這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200 歲的生日和未出生的生日都是不合理的,應該

1016. 部分A+B (15) 時間限制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB 判斷程式 Standard (來自 小小)

題目描述正整數A的“DA(為1位整數)部分”定義為由A中所有DA組成的新整數PA。例如:給定A = 3862767,DA = 6,則A的“6部分”PA是66,因為A中有2個6。 現給定A、DA、B、DB,請編寫程式計算PA + PB。輸入描述:輸入在一行中依次給出A、D

A+B和C (15)間限 時制 1000 ms 記憶體限制 32768 KB 程式碼長度限制 100 KB

題目描述給定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字: A1 = 能被5整除的數字中所有偶數的和; A2 = 將被5除後餘1的數字按給出順序進行交錯求和,即計算n1-n2+n3-n4...; A3 = 被5除後餘2的數字的個數; A4 = 被5除後

石子合併NOI1995題解

題目描述 在一個圓形操場的四周擺放N堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。 試設計出1個演算法,計算出將N堆石子合併成1堆的最小得分和最大得分. 輸入輸出格式 輸入格式: 資料的第1行試正整數N,1≤N≤100,表示有

如何做名優秀的博士生時間的付出

轉載自科學網-施一公的部落格 【 序:我從獲得博士學位至今已經整整16個春秋,但博士階段的感受仍然歷歷在目。我從指導自己獨立實驗室的第一個博士生到現在也已經13年了,其中的博士研究生和博士後中已經有11人在美國和中國的大學裡擔任獨立實驗室的PI。他們的成長過程差別極大,性格、能力也各有不同。應該

如何做名優秀的博士生時間的付出 施

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post"

石子合併NOI1995

F: 石子合併(NOI1995) 時間限制: 1 Sec  記憶體限制: 128 MB 題目描述 在操場上沿一直線排列著 n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆石子合併成新