動態規劃——Multiplication Puzzle
The goal is to take cards in such order as to minimize the total number of scored points.
For example, if cards in the row contain numbers 10 1 50 20 5, player might take a card with 1, then 20 and 50, scoring
If he would take the cards in the opposite order, i.e. 50, then 20, then 1, the score would be
6 10 1 50 50 20 5Sample Output
3650
題意:
給n-1個矩陣排成的序列,現在讓你求這n-1個矩陣相乘的最小計算量。
思路:
區間dp
n*m的矩陣和m*p的矩陣相乘的計算量是n*m*p,,這題可以把整個序列分成更小的問題,即每次都是計算第i個矩陣乘到第j個矩陣的最小計算量,記憶化搜尋即可。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <algorithm> #include <vector> #include <stack> #define INF 0x3f3f3f3f #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int maxn=105; int dp[maxn][maxn]; int a[maxn]; int n; int work(int x, int y) //計算x到y的最小計算量 { if(dp[x][y]!=INF) return dp[x][y]; if(x==y) return dp[x][y]=0; else { for(int i=x; i<=y; i++) //再次分成更小的區間 dp[x][y]=min(dp[x][y], work(x, i)+work(i+1, y)+a[x]*a[i+1]*a[y+1]); return dp[x][y]; } } int main() { while(~scanf("%d", &n)) { memset(a, 0, sizeof(a)); memset(dp, 0x3f, sizeof(dp)); for(int i=1; i<=n; i++) scanf("%d", &a[i]); printf("%d\n", work(1, n-1)); } return 0; }
相關推薦
動態規劃——Multiplication Puzzle
The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one ca
動態規劃——Poj 1651 Multiplication Puzzle
1) 題目 Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4948 Accepted: 2958 Description The
動態規劃之劃分動態規劃:矩陣鏈乘 poj 1651 Multiplication Puzzle
題意:給你n個數,進行如下操作,問最小值 For example, if cards in the row contain numbers 10 1 50 20 5, pla
POJ 1651 Multiplication Puzzle 動態規劃及搜尋
這是一道比較簡單的DP,通過分析可以設最後拿走的牌為i,則所求的最優解就是i左邊和右邊子列的最小連乘積再加上x[a]*x[i]*x[b],因為i將原來的序列劃分為兩個子列,這兩個子列符合“最優子結構”和“重疊子問題”的dp特點,他們的最優解互相之間沒有影響,只會影響全域性問題
動態規劃 (Dynamic Programming) 之 矩陣鏈乘法(Matrix Chain Multiplication)
這個問題是動態規劃的基礎的問題,也是演算法導論中討論過的問題。在這裡先簡單描述一下。假定有一組矩陣需要做乘法操作。但是我們知道首先矩陣乘法滿足了結合律。所以可以按照不同的順序做乘法。而且不同順序做乘法最後的乘法次數是不同的。比如〈A1, A2, A3〉分別是10 × 100,
演算法之動態規劃-矩陣鏈相乘(matrix-chain multiplication)
Matrix-chain multiplication 給定一串矩陣 A1,A2...An,計算矩陣的值:A1A2A3..An。對於這串矩陣序列,不同的加括號方式,會導致截然不同的計算量。我們需要做的就是計算出如何加括號,達到最少計算量。 使用動態規劃求解
動態規劃背包問題 洛谷P1064 金明的預算方案
輸出 ret 設計 div 輸入輸出 style 乘號 輸入輸出格式 sin P1064 金明的預算方案 題目描述 金明今天很開心,家裏購置的新房就要領鑰匙了,新房裏有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麽布置,你
動態規劃分析總結——怎樣設計和實現動態規劃算法
基於 進一步 使用 sdn 能夠 疑惑 樓梯 -1 們的 進行算法設計的時候,時常有這種體會:假設已經知道一道題目能夠用動態規劃求解,那麽非常easy找到對應的動態規劃算法並實現;動態規劃算法的難度不在於實現,而在於分析和設計—— 首先你得知道這道題目須要用動態規劃來求
Maximum sum-動態規劃
ddl border 數組 clear fonts nts input gree img A - Maximum sum Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d
行編輯距離Edit Distance——動態規劃
add 最小 base 編輯 cpp style 進行 sel 等於 題目描寫敘述: 給定一個源串和目標串。可以對源串進行例如以下操作: 1. 在給定位置上插入一個字符 2. 替換隨意字符 3. 刪除隨意字符 寫一個程序。返回最小操作數,使得對源串進行這些操
【Java】【滾動數組】【動態規劃】UVA - 11137 - Ingenuous Cubrency
得到 lose math scanner light clas details 狀態 ann 滾動數組優化自己畫一下就明白了。 http://blog.csdn.net/u014800748/article/details/45849217 解題思路:本題利用遞推關系解決。
hiho150周 - 動態規劃*
得來 targe pac cnblogs int def spa blog efi 題目鏈接 一個n*m的迷宮由‘.’和‘b‘組成,從(1,1)走到(n,m),只能向右或者向下走,但遇到‘b’時才能改變方向,開始時方向向右。 問到達(n,m)至少改變幾個位置上的值 /***
洛谷P1077 擺花 動態規劃
return log scanf ons 劃分 cst print 分類 方案 洛谷P1077 擺花 DP 劃分類動態規劃 dp[ i ][ j ] 表示 到 第 i 種花,所有花總共取了 j 盆,總共的方案數 1 #include <cstdi
[C++] 動態規劃之矩陣連乘、最長公共子序列、最大子段和、最長單調遞增子序列
每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想 動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。 將待求解問題分解成若幹個子問題,先求
入門動態規劃 洛谷P1108 低價購買
i++ 一支 股票 algorithm namespace 整數 變形 價格 div P1108 低價購買 題目描述 “低價購買”這條建議是在奶牛股票市場取得成功的一半規則。要想被認為是偉大的投資者,你必須遵循以下的問題建議:“低價購買;再低價購買”。每次你購買一支股票,你
動態規劃之01背包問題(含代碼C)
bsp sys 最優解 ret 時間復雜度 維數 style 時間 沒有 1.動態規劃的基本思想 動態規劃算法通常用於求解具有某種最優性質的問題。其基本思想也是將待求解問題分解成若幹個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動
【動態規劃】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
and main spa def esp 動態 return 價值 can 劃分那個序列,沒必要完全覆蓋原序列。對於劃分出來的每個序列,對於某個值v,要麽全都在該序列,要麽全都不在該序列。 一個序列的價值是所有不同的值的異或和。整個的價值是所有劃分出來的序列的價值之和。
Multiplication Puzzle POJ - 1651
stream can eof rds ber put opposite posit name 10*1*50 + 50*20*5 + 10*50*5 = 500+5000+2500 = 8000 If he would take the cards in the oppos
hud2059龜兔賽跑(動態規劃)
n+1 動物 include output script text sam 起跑線 other 龜兔賽跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T
poj 動態規劃專題練習
b+ 結點 練習 不難 loading get 初始 cas 動態 http://poj.org/problem?id=2336 大意是要求一艘船將m個車運到對岸所消耗的最短時間和最小次數 定義dp[i][j]運送前i個車,當前船上有j個車所消耗的時間,非常容易得到如下ac