在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。
試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.
輸入格式:
資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.
輸出格式:
輸出共2行,第1行為最小得分,第2行為最大得分.
輸入樣例#1:複製
4輸出樣例#1:複製4 5 9 4
43一道區間dp題,第一次寫區間dp,真尼瑪玄學54
#include#define inf 0x3f3f3f3f
using namespace std;
int a[205],sum[205];
int opt1[205][205],opt2[205][205];
int sun(int i,int j)//求出區間[i,j]的和
int main()
for(int i=1;i<=2*n;i++)//方便求區間和
sum[i]=sum[i-1]+a[i];
for(int l=1;lfor(int i=1,j=i+l;i<2*n&&j<2*n;i++,j=i+l)//列舉各個長度為l的區間 }
int min_ans=inf, max_ans=0;
for(int i=1;i<=n;i++)//找到長度為n的最優區間 取其值
cout
}
洛谷 P1880 NOI1995 石子合併
這道題是之前石子合併的加強板 不同在於是乙個環 處理方法就是把陣列 乘以2,列舉起點轉化成鏈。以後這種環的問題應該都可以這樣來轉化。陣列空間不要忘了乘以2 然後要注意區間從長度為2開始,初始化為最大或最小 注意這裡的得分是合併之後的得分,所以單獨一堆是沒有得分的。include include in...
洛谷 P1880 NOI1995 石子合併
在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別...
洛谷 P1880 NOI1995 石子合併
鏈結 思路 區間dp,只不過是環上的,把整個序列複製乙份就好了。dp l r 表示l到r的最大 小值,狀態轉移方程就是dp l r max min 5455 inta m 56int sum m 57int dp max 1005 1005 58 int dp min 1005 1005 59 in...