1. 程式人生 > >演算法設計與分析習題3-3 石子合併問題直線排列最大得分

演算法設計與分析習題3-3 石子合併問題直線排列最大得分

 此題有直線,圓形兩種問法。 分別有最大得分最小得分解法。簡單的dp。

直線最大得分

#include <iostream>
#include <stdio.h>


using namespace std;


int main()
{
    freopen("in.txt","r",stdin);
    int n;
    cin>>n;
    int a[100],m[100][100];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=2;i<=n;i++)
    {
        a[i]=a[i]+a[i-1];
    }

     //預設初始化m[i][i]=0,可以理解為初始的每一堆不合並則得分為0
    for(int r=2;r<=n;r++)
    {
        for(int i=1;i<=n-r+1;i++)
        {
            int j=i+r-1;
            if(m[i+1][j]>m[i][j-1])    //m[i][j]表示從i到j的最大得分,因為只能相鄰合併,所以有兩種情況,m[i][i]與m[i+1][j]或m[i][j-1]與m[j][j]  
            m[i][j]=m[i+1][j]+a[j]-a[i-1];    
            else
            m[i][j]=m[i][j-1]+a[j]-a[i-1];
        }
    }
    cout<<m[1][n]<<endl;
    return 0;
}

相關推薦

演算法設計分析習題3-3 石子合併問題直線排列得分

 此題有直線,圓形兩種問法。 分別有最大得分最小得分解法。簡單的dp。 直線最大得分 #include <iostream> #include <stdio.h> using namespace std; int main() {     freop

演算法設計分析》迴圈右移合併陣列

題目:有已經排好序的陣列arr[0:k-1]和arr[k:n-1],現在將兩個數組合併成一個大的有序陣列。要求:時間複雜度最壞的情況下為0(n),空間複雜的度為o(1)。 之前看過《演算法筆記》上面將遞迴時,有個two pointers思想,講的正好是怎麼將兩個有序陣列在時

計算機演算法設計分析課本(王曉東著)課後演算法實現題1-3 多約數問題

問題描述: 正整數x的約數是能整除x的正整數。正整數x的約數個數記為div(x)。例如,1 2 5 10都是10的約數,且div(10)=4。設a和b是2個正整數,a<=b,找出a和b之間約數個數最多的數x。 演算法設計: 對於給定的2個正整數a<=b,計算a和b之間約數個數最多

《計算機演算法設計分析 第2版+第3版+第4版 (王曉東) 》原書附答案pdf版電子書附下載連結+30個總結JVM虛擬機器的技術文排版好(收藏版)

技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的

演算法設計分析:第三章 分治 3.3二進位制整數的乘法

/* 二進位制大整數的乘法: 請設計一個有效的演算法,可以進行兩個n 位二進位制大整數的乘法運算 設x = 3141, A = 31 B=41 y = 5327, C = 53,D=27 x*y = AC*2^n + (AD + BC)*2^(n/2) + BD

演算法設計分析: 3-15 雙調旅行售貨員問題

3-15 雙調旅行售貨員問題 問題描述 歐氏旅行售貨員問題是對給定的平面上 n 個點確定一條連線這 n 個點的長度最短的哈密 頓迴路。由於歐氏距離滿足三角不等式,所以歐氏旅行售貨員問題是一個特殊的具有三角不 等式性質的旅行售貨員問題。它仍是一個 NP

Kruskal演算法小生成樹-演算法設計分析實驗3

題目: 求如圖所示,用kruskal演算法求下面圖的最小生成樹: 話不多說,程式如下: #include<iostream> #include<stdlib.h> #define N 7 using namespace std; typedef

演算法設計分析: 3-28 m處理器問題

3-28 m處理器問題 問題描述 在一個網路通訊系統中,要將 n 個數據包依次分配給 m 個處理器進行資料處理,並要求處理器負載儘可能均衡。 設給定的資料包序列為:{σ0,σ1,...,σn−1}{σ0,σ1,...,σn−1}。 m處理器問題

演算法設計分析基礎【第三版】習題1.1 4

演算法設計與分析基礎 習題1.1 4 設計一個[√n]的演算法,n是任意正整數。除了賦值和比較運算,該演算法只能用到基本的四則運算。 程式碼實現: #include "iostream" using namespace std; double n; doubl

三分搜尋 (演算法設計分析課後習題)

三分搜尋演算法的做法是:它先將待查元素x與n/3處的元素比較,然後將x與2n/3處的元素進行比較。比較的結果或者找到x,或者將搜尋範圍縮小的原來的n/3 1)編寫C++程式實踐演算法 2)分析演算法的時間複雜度 1) #include <cstdio> in

演算法設計分析——動態規劃(一)矩陣連乘

動態規劃——Dynamic programming,可以說是本人一直沒有啃下的骨頭,這次我就得好好來學學Dynamic programming. OK,出發! 動態規劃通常是分治演算法的一種特殊情況,它一般用於最優化問題,如果這些問題能夠: 1.能夠分解為規模更小的子問題 2.遞迴的

演算法設計分析——分治法

前言 本文重點回顧了卜老師課堂上關於分治演算法的一些常見的問題。加油吧!ヾ(◍°∇°◍)ノ゙ 分治法(Divide and Conquer) 當面對一個問題的時候,我們可能一下子找不到解決問題的方法。此時,我們可以考慮將問題規模最小化,先看看當問題規模變小以後,我們如何去解決

演算法設計分析04-排序問題

①氣泡排序:量量比較待排序資料元素的大小,發現兩個資料元素的次序相反時進行交換,直到沒有反序的資料元素為止。時間複雜度是O(n*2)。穩定的。下面給出兩種排序演算法,我比較喜歡第二種,因為第二種才能真正解釋冒泡的原理 public class bubble1 {    &n

演算法設計分析03-十進位制轉二進位制問題

10進位制數轉2 進位制數 題目:2 進位制除了 0,1,還可以用 2 表示。例如: 1-> 1 2-> 10 or 02 3->11 4 ->100 or 020 or 012 問題:這樣一個十進位制數轉為二進位制數,就不是唯一的了。現求十進位制數 N 轉換為這種二進位制數

演算法設計分析02-走臺階問題

走臺階問題,一次可以走1,2,3級,都 N級臺階的方法數 。 初始:f(0) = 0; f(1) =1; f(2) = 1 + 1 = 2; 遞推公式:f(n) = f(n - 1) + f(n-2) + f(n - 3) 解題思路: 因為一次可以走1,2,3級,所以在第

演算法設計分析01-連結串列的逆置

一.最常用的方法: LNode*  ReverseList(LNode* head) {     if (head == NULL)         return NULL;  &nbs

演算法設計分析05-最近點對演算法

1.題目描述: 設S是平面上n個點的集合,在這一節中,我們考慮在S中找到一個點對p和q的問題,使其相互距離最短。換句話說,希望在S中找到具有這樣性質的兩點p1 = (x1,y1)和p2 = (x2,y2),使它們間的距離在所有S中點對間為最小 2.解題思路 一共分為三種情況 情況1:

演算法設計分析課程的時間空間複雜度

演算法設計與分析課程的時間空間複雜度: 總結 演算法 時間複雜度 空間複雜度 說明 Hanoi $ O(2^n) $ $ O(n) $ 遞迴使用 會場安排問題 \(O

【計算機演算法設計分析】——SVM

一.簡介 支援向量機(support vector machines)是一種二分類模型,它的目的是尋找一個超平面來對樣本進行分割,分割的原則是間隔最大化,最終轉化為一個凸二次規劃問題來求解。由簡至繁的模型包括: (1)當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性可分支援向量機;(2)當訓練樣本近似

演算法設計分析作業題】第十一週:20. Valid Parentheses

題目 C++ solution class Solution { public: bool isValid(string s) { stack<char> cstack; for (int i = 0; i < s.si