1. 程式人生 > >動態規劃——Multiplication Puzzle

動態規劃——Multiplication Puzzle

The multiplication puzzle is played with a row of cards, each containing a single positive integer. During the move player takes one card out of the row and scores the number of points equal to the product of the number on the card taken and the numbers on the cards on the left and on the right of it. It is not allowed to take out the first and the last card in the row. After the final move, only two cards are left in the row. 

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 
10*1*50 + 50*20*5 + 10*50*5 = 500+5000+2500 = 8000

If he would take the cards in the opposite order, i.e. 50, then 20, then 1, the score would be 
1*50*20 + 1*20*5 + 10*1*5 = 1000+100+50 = 1150.
Input The first line of the input contains the number of cards N (3 <= N <= 100). The second line contains N integers in the range from 1 to 100, separated by spaces. Output Output must contain a single integer - the minimal score. Sample Input
6
10 1 50 50 20 5
Sample 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