1. 程式人生 > >演算法練習之石子歸併

演算法練習之石子歸併

題目描述


在一個操場按次序從左到右擺放著n堆石子(n≤l00),現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分,求最小的得分總和。
輸入


第1行為石子堆數n;
第2行為每堆的石子數,每兩個數之阿用一個空格分隔。
輸出


最小的得分總和。
樣例輸入


6
3 4 6 5 4 2
樣例輸出


61

程式碼如下:

#include <iostream>
#define N 100
#define MAX 1000
using namespace std;
int _sum(int p[],int i,int j)
{
    int sum=0;
    for(int k=i;k<=j;k++)
        sum=sum+p[k];
    return sum;
}
void Dp(int p[],int n,int s[][N])
{
    for(int l=2;l<=n;l++)
    {
        for(int i=0;i<=n-l+1;i++)
        {
            int j=l+i-1;
            s[i][j]=MAX;
            for(int k=i;k<j;k++)
            {
                int q=s[i][k]+s[k+1][j]+_sum(p,i,j);
                if(q<s[i][j])
                {
                    s[i][j]=q;
                }
            }
        }
    }
}
int main()
{
    int p[N],n,s[N][N];
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>p[i];
    }
    Dp(p,n,s);
    cout<<s[0][n-1];
    return 0;
}
就是簡單的動態規劃而已。

相關推薦

演算法練習石子歸併

題目描述 在一個操場按次序從左到右擺放著n堆石子(n≤l00),現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分,求最小的得分總和。 輸

JAVA演算法習題集合—第一階段3:基礎演算法練習水仙花數判斷

知識點:資料型別轉換、while迴圈語句、for迴圈、陣列的使用。 1.整數位數判斷 輸入一個整數,輸出這個整數是幾位數。 執行結果: 輸入:56424 輸出:5 Scanner input=new Scanner(System.in); System.out.p

JAVA演算法習題集合—第一階段2:基礎演算法練習for迴圈的練習

  知識點:for迴圈、for迴圈和if語句的巢狀使用 8、輸出1到100 描述:輸出從1到100 執行結果: 1 2 3 4...100 for(int i=1;i<=100;i++){ Syste

每日演算法練習括號配對

package myjava; import java.util.ArrayList; import java.util.Scanner; /** * @author wang: * @ver

演算法練習二叉查詢樹 C++實現

/////////////////Tnode.h//////////////// class TNode { public: ////methods TNode(void); TNode(int data); ~TNode(void);

演算法練習兩數之和

上週五(1.4號)看到群裡有再說力扣(https://leetcode-cn.com/)的演算法題,自己就去搜索了下,發現是練習演算法、資料庫、shell的平臺,很不錯。 週五下午在測試的間隙,自己做了一道簡單的演算法題,剛好把這兩天覆習的python的基礎知識複習了。     演

五十道程式設計小題目 --- 28 八大排序演算法 java 07歸併排序

7. 歸併排序(Merge Sort) 基本思想: 歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。 歸併排序示例:   合併方法: 設r[

動態規劃學習石子歸併

一.題目描述:在一個圓形操場的四周擺放著N 堆石子(N<=100),現要將石子有次序地合併成一堆.規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數記為該次合併的得分.編寫一程式,讀入堆疊數N 及每堆棧的石子數(<=20).(1)選擇一種合併石子的方案

區間DP入門 石子歸併問題 NYOJ 737

分析:要求n個石子歸併,我們根據dp的思想劃分成子問題,先求出每兩個合併的最小代價,然後每三個的最小代價,依次知道n個。 定義狀態dp [ i ] [ j ]為從第i個石子到第j個石子的合併最小代

[其它-GarsiaWachs演算法]51nod 1023 石子歸併v3

基準時間限制:2 秒 空間限制:131072 KB 分值: 640 難度:8級演算法題 N堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。

每日演算法練習李白喝酒問題

李白打酒   話說大詩人李白,一生好飲。幸好他從不開車。    一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱:   無事街上走,提壺去打酒。        逢店加一倍,遇花喝一斗。    這一路上,他一共遇到店5次,遇到花10次,已知最後一次遇到的是花,他正好把

演算法學習分治--歸併排序

分治的基本概念: 把一個任務,分成形式和原任務相同,但規模更小的幾個部分任務(通常是兩個部分),分別完成,或只需要選一部完成。然後再處理完成後的這一個或幾個部分的結果,實現整個任務的完成。 陣列排序

動態規劃練習-環狀石子歸併+四邊形不等式優化

思路:環狀的直接在n後面加上a[0]-a[n]變成鏈狀即可。 這題範圍小,如果n<1000,則必須四邊形不等式優化降低複雜度為O(n^2) Code: #include <bi

資料結構與演算法C++歸併排序(續)

上一篇部落格中實現的是自上以下的歸併排序,自上而下需要先不斷將陣列進行對半拆分(遞迴實現),然後再合併排序 其實也可以自下而上實現歸併排序,這樣使用for迴圈就可以實現,省掉了遞迴的操作 首先對陣列的每一個元素進行兩兩歸併(相鄰的兩個元素合併成一個有序陣列),然後將合併好的兩個元素的有序

資料結構與演算法C++歸併排序

上兩篇部落格使用的選擇排序和插入排序的演算法複雜度都是O(n2),這在陣列元素比較多的時候和一些演算法複雜度為O(nlogn)的快速排序演算法相比,差距還是很明顯的,如下圖 當有10萬個元素的時候,快速排序演算法比普通的選擇排序演算法要快了6000倍, 本篇部落格介紹的是快速排序演算法

排序演算法大雜燴歸併排序

排序演算法大雜燴主幹文章傳送門 歸併排序 #include <iostream> #include <vector> using namespace std; //典型的分治策略,拆分,解決,合併 void Merge(vector<int>

演算法講解 -- 區間dp經典模型與優化(石子歸併

石子合併問題是最經典的DP問題。首先它有如下3種題型: PPT講解:點選開啟連結 (1)有N堆石子,現要將石子有序的合併成一堆,規定如下:每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這N堆石子合併成一堆的總花費最小(或最大)。   分析:當然這種情

排序演算法二:歸併排序

演算法分析:是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 將已有序的子序

Java學習路 幾大排序演算法練習

幾大排序演算法練習 1、各種排序演算法** 氣泡排序 (Bubble Sort) 選擇排序 (Selection Sort) 插入排序 (Insertion Sort) 氣泡排序(Bubble Sort) 基本思想是對比相鄰的元素值,如果滿足條件就交換元

圖解排序演算法(四)歸併排序

package sortdemo; import java.util.Arrays; /** * Created by chengxiao on 2016/12/8. */ public class MergeSort { public static void main(S