石子合併(一) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆
#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));
}
}
相關推薦
石子合併(一) 時間限制: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 <str
剛哥遇到了感情問題(二) 時間限制:1000 ms | 記憶體限制:65535 KB 難度:1 描述 上一集我們講到 作為工作室老大的剛哥遇到很多女生的追求,你幫他個挑選了個英語成績不錯的物件。在你
# include <stdio.h> # define N 201 char A[][7]={"apple","banana","orange"}; //A->B char B[][5]={"miss","love","kiss"}; int S[]=
超級臺階 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少走法? 注:規定從一級到一
#include <stdio.h>int a[41];int fun(int i){if(a[i] != 0)return a[i];else{a[i] = fun(i - 1) + fun(i - 2);return a[i];}}int main(){a[
郵票分你一半 時間限制:1000 ms | 記憶體限制:65535 KB 難度:3 描述 小珂最近收集了些郵票,他想把其中的一些給他的好朋友小明。每張郵票上都有分值,他們想把這些郵票分成兩
#include<stdio.h>#include<string.h>using namespace std;int val[500001]; int main(){int n,m,i,j,sum;int a[1001];scanf("%d",&am
揹包問題 時間限制:3000 ms | 記憶體限制:65535 KB 難度:3 描述 現在有很多物品(它們是可以分割的),我們知道它們每個物品的單位重量的價值v和重量w(1
#include<iostream>#include<algorithm>using namespace std;struct vw{int v;int w;};bool cmp(vw p1,vw p2){if(p1.v<p2.v)return
兩點距離 時間限制: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 難度:1 描述 相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只
#include <stdio.h>int main (void){int a,b,c;scanf("%d%d%d",&a,&b,&c);for (int sum=10;sum<=100;sum++){if (sum%3==a&am
素數距離問題 時間限制: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堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆石子合併成新