1. 程式人生 > >noip1995石子合併-dp

noip1995石子合併-dp

#include<cstdio>

using namespace std;
const int maxn=99999999;
int num[510];
int sum[510][510];//這一次合併得到的分數
int fmax[510][510];//從第i堆石子開始,合併j堆石子得到的最大值
int fmin[510][510];//從第i堆石子開始,合併j堆石子得到的最小值

int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&num[i]);
        sum[i][1]=num[i];
        fmax[i][1]=0;
        fmin[i][1]=0;
    }

    for(j=2;j<=n;++j)
        for(i=1;i<=n;++i)
            sum[i][j]=num[i]+sum[(i%n)+1][j-1];//轉一圈,相當於從誰開始合併都考慮了。

    for(j=2;j<=n;++j)
    {
        for(i=1;i<=n;++i)
        {
            fmax[i][j]=0;
            fmin[i][j]=maxn;
            for(int k=1;k<=j-1;++k)
            {
                int next=((i+k-1)%n)+1;
                if(fmax[i][j]<sum[i][j]+fmax[next][j-k]+fmax[i][k])//序列一序列二合併也會得分而且得的分都是sum[i][j]因為加法滿足結合律。
                    fmax[i][j]=sum[i][j]+fmax[next][j-k]+fmax[i][k];
                if(fmin[i][j]>sum[i][j]+fmin[next][j-k]+fmin[i][k])
                    fmin[i][j]=sum[i][j]+fmin[next][j-k]+fmin[i][k];
            }
        }
    }
    //哪個位置當第一次合併
    int min=maxn ,max=0;
    for(i=1;i<=n;++i)
    {
        if(min>fmin[i][n])
            min=fmin[i][n];
        if(max<fmax[i][n])
            max=fmax[i][n];
    }
    printf("%d\n%d",min,max);
    return 0;
}

相關推薦

noip1995石子合併-dp

#include<cstdio> using namespace std; const int maxn=99999999; int num[510]; int sum[510][510];//這一次合併得到的分數 int fmax[510][510];//從第i堆石子開始,合併j堆石子得到的最

NUIST OJ 1410 石子合併 [DP]

題目 題目分析 本題的區間DP 整體程式碼與執行結果 另一種寫法 未完待續 題目 題目描述 設有N堆沙子排成一排,其編號為1,2,3,…,N(N<=1

P1880 [NOI1995]石子合併 區間dp+拆環成鏈

思路 :一道經典的區間dp  唯一不同的時候 終點和起點相連  所以要拆環成鏈  只需要把1-n的陣列在n+1-2*n複製一遍就行了 #include<bits/stdc++.h> using namespace std; const int maxn=100

nyoj737—石子合併(一)(區間DP

描述     有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過N-1次合併後成為一堆。求出總的代價最小值。 輸入 有多組測試資料,輸入到檔案結束

51Nod 1021 石子合併 區間dp

N堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將N堆石子合併成一堆的最小代價。   例如: 1 2 3 4,有不少合併方法 1 2 3 4 => 3 3 4(3) => 6 4

[NOI1995]石子合併(區間DP

題目連結: [NOI1995]石子合併   思路: 區間DP經典例題,可以把前n-1堆石子一個個移到第n個後面,那樣環就變成了線,即現在有2*n-1堆石子需要合併。   程式碼: #include <iostream> #include

[區間DP]石子合併極其變種問題(環形,40000堆型)P1880 [NOI1995]石子合併+[Sdoi2008]石子合併/poj1738An old Stone Game

 有N堆石子,現要將石子有序的合併成一堆,規則如下: (1)每次只能移動任意相鄰的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這N堆石子合併成一堆總花費,要求N<=300。 變形一:(2)每次只能移動相鄰的2堆石子合併,合併花費為新合成的一堆石子的數量。求將

【區間dp*2】洛谷 P1880 [NOI1995]石子合併 (推導過程) +尼克的任務(還沒寫)

emmmmm給自己設定了一個習慣界限。其實每次看到他們在做啥啥啥而我都大三都現在了  就會感覺很內傷-、- 不過演算法還是要寫的吧 別寫太多而已... 為了防止腦袋空空 也為了防止一天不知道幹什麼 ================================== &

[區間DP] P1880 [NOI1995] 石子合併 P1063 能量項鍊

dp[i][j] 表示i-j區間的合併最優解 dp[i][j]={可以合併的區間+當前合併的代價} 在一個圓形操場的四周擺放N堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。 試設計出1個

四邊形不等式(dp優化)應用及證明(石子合併n^2)

石子合併是一道很經典的區間動規。 在n^3的暴力裡面,我們的狀態轉移方程是: f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+w[i][j])f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+w[i]

藍橋杯/nyoj 737 合併石子 區間dp+平行四邊形優化

問題描述   在一條直線上有n堆石子,每堆有一定的數量,每次可以將兩堆相鄰的石子合併,合併後放在兩堆的中間位置,合併的費用為兩堆石子的總數。求把所有石子合併成一堆的最小花費。 輸入格式   輸入第一行包含一個整數n,表示石子的堆數。   接下來一行,包含n個整數,按

nyoj 737 石子合併(一) 【區間dp

石子合併(一) 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:3 描述    有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次

石子合併 (區間DP

一.試題在一個園形操場的四周擺放N堆石子(N≤100),現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數N及每堆的石子數(≤20),①選擇一種合併石子的方案,使得做N-1次合併,得分

藍橋杯 —— 石子合併問題 —— Dp

題目大意是說給你一個n,代表有n堆石子。然後給你n個數,分別表示每堆石子的個數。 要求是每次只能合併相鄰的兩堆石子,每合併一次就把ans += 需要被合併的兩堆石子的個數。 問怎樣合併使得最後所需要的費用 ans 值最小。 解題思路:這道題不能夠用區域性最優的貪心思想

石子合併問題 (區間dp

石子合併問題是最經典的DP問題。首先它有如下3種題型:(1)有N堆石子,現要將石子有序的合併成一堆,規定如下:每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這N堆石子合併成一堆

石子合併【區間dp

有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過N-1次合併後成為一堆。求出總的代價最小值

石子合併(一) 區間dp

石子合併(一) 題目描述:     有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子併成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過N-1次合併後成為一堆。求出總的代價最小值。 輸入描述: 有多組測試資料,輸入到

石子合併最大最小值(區間dp)

一條直線上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分 #include<stdio.h> #in

洛谷 P1880 石子合併 區間dp

題目描述 在一個園形操場的四周擺放N堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。 試設計出1個演算法,計算出將N堆石子合併成1堆的最小得分和最大得分. 輸入輸出格式 輸入格式: 資料的

ACM DP 石子合併問題

滴,集訓第二十一天打卡。 可能是對組隊不太滿意,都不大高興做新的訓練... 所以最近一直在磨DP,翻一下部落格,發現最近都是DP啊... 這個石子合併的,我做的訓練資料n是40000直線型的,一開始沒