lanqiao 演算法訓練

2021-08-14 20:24:10 字數 1023 閱讀 2243

問題描述

給出n個數字,不改變它們的相對位置,在中間加入k個乘號和n-k-1個加號,(括號隨便加)使最終結果盡量大。因為乘號和加號一共就是n-1個了,所以恰好每兩個相鄰數字之間都有乙個符號。例如:

n=5,k=2,5個數字分別為1、2、3、4、5,可以加成:

1*2*(3+4+5)=24

1*(2+3)*(4+5)=45

(1*2+3)*(4+5)=45 ……

輸入格式

輸入檔案共有二行,第一行為兩個有空格隔開的整數,表示n和k,其中(2<=n<=15, 0<=k<=n-1)。第二行為 n個用空格隔開的數字(每個數字在0到9之間)。

輸出格式

輸出檔案僅一行包含乙個整數,表示要求的最大的結果

樣例輸入

5 2

1 2 3 4 5

樣例輸出

120樣例說明

(1+2+3)*4*5=120

本題採用動態規劃演算法,不要考慮括號,只從乘號來考慮,設dp[i][j]表示,i個元素裡有j個乘號時算式的最大值。sum[i]表示前i個元素的和。

因此動態規劃狀態轉移方程為:dp[i][j]=max(dp[i][j],dp[l-1][j-1]*(sum[i]-sum[l-1]]),思路:假設最後乙個乘號出現在第l個元素之前,所以問題就轉化為了求前l-1個數加j-1個乘號最大的算式值載乘上第l個元素到第i個元素的和,而l-1個元素加j-1個乘號又可以按相同的方法分解為更小的子問題。只要找出乙個l使得最後乙個乘號出現在這個位置上時的值最大,就可以存入dp[i][j]中。

#include#includeusing namespace std;

long long dp[18][18],sum[18]=;//因為題目沒說資料規模所以最好用long long

int main()

for(int i=2;i<=n;i++)//自頂向下計算i個元素的算式最大值,注意從2開始元素最少有2個 }

cout

}

lanqiao 矩陣乘法

問題描述 輸入兩個矩陣,分別是m s,s n大小。輸出兩個矩陣相乘的結果。輸入格式 第一行,空格隔開的三個正整數m,s,n 均不超過200 接下來m行,每行s個空格隔開的整數,表示矩陣a i,j 接下來s行,每行n個空格隔開的整數,表示矩陣b i,j 輸出格式 m行,每行n個空格隔開的整數,輸出相乘...

DL RBM訓練演算法

在學習hinton的stack autoencoder演算法 reducing the dimensionality of data with neural networks 之前需要了解什麼是rbm,現在就我學習的情況,查詢的資料 大部分來自部落格 簡單介紹一下rbm。當然,這裡面還有同組實驗的同...

演算法訓練 C Calculations

問題描述 c 語言和c 語言非常相似,然而c 的程式有時會出現意想不到的結果。比如像這樣的算術表示式 表示式 基本式 表示式 基本式 表示式 基本式 基本式 增量 係數 增量 增量 a a 係數 0 1 2 1000 如 5 a 3 a a 是合法的c 表示式。計算這樣的表示式的值的方法 首先是每個...