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直線型的,一開始沒