NUIST OJ 1411 繼續合併石子 DP

2021-08-18 22:55:40 字數 1240 閱讀 3753

題目描述

在乙個圓環上分布著n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數記為得分。

輸入描述

每組資料的第1行為正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.

輸出描述

輸出共2行,第1行為最小得分,第2行為最大得分

樣例輸入

4

4 4 5 9

樣例輸出

43

54

用dp[i][j]表示合併[i,j]區間所需要的最小代價

那麼可以方便的得到如下關係

若i=j,則dp[i][j]=0

否則,則dp[i][j]=min+sum[i][j]

發現:計算dp[i][j]的大區間,需要先計算出dp[i][j]的小區間,所以可以考慮設定乙個變數len,從小往大遞增,根據此來控制先算小區間,再算大區間

最後,本題要求的是合併所有石子,即[i,j]區間和並的最小代價。

因此,本題答案儲存在dp[1][n]內

/*

zhangbinjie@penguin

*/#include

#include

#include

#include

#define maxn 105

using

namespace

std;

int a[maxn*2];

int dp[maxn*2][maxn*2];

int dpm[maxn * 2][maxn * 2];

int sum[maxn*2][maxn*2];

int main()

for (int i = 1; i <= n; ++i)

}for (int len = 2; len <= n; ++len) }}

mi = dp[1][n];

ma = dpm[1][n];

for (int i = 2; i < n; ++i)

cout

<< ma << " "

<< mi << endl;

}return

0;}

結果如下

141,整數型別

int,float,double,bool,character,string array,dictionary,元組型別 tuple 可選型別 optional 資料型別的首字母是大寫的 在變數名後面加冒號 和資料型別 var age int 10 一般,沒有必須明確指定變數和常量的型別。如果在宣告...

141 長按鍵入

題目描述 你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字元 c 時,按鍵可能會被長按,而字元可能被輸入 1 次或多次。你將會檢查鍵盤輸入的字元 typed。如果它對應的可能是你的朋友的名字 其中一些字元可能被長按 那麼就返回 true。示例 1 輸入 name alex typed aa...

解除安裝qemu 1 4 1

由於通過原始碼安裝的qemu沒有辦法通過系統工具進行解除安裝,也沒有辦法通過make uninstall方法解除安裝,所以只能通過刪除檔案的方式進行解除安裝。qemu可執行檔案預設放在 usr local bin,庫檔案預設放在 usr local libexec,配置檔案預設放在 usr loca...