P1880 NOI1995 石子合併

2022-08-18 23:09:11 字數 892 閱讀 7711

zy嚶嚶嚶

這題,跟能量項鍊比較像哈,反正就是乙個加,乙個乘,但是,加法肯定是要比乘法簡單的,so這題應該也要比能量項鍊簡單(其實兩題真的p區別都沒有) 區間dp,三重迴圈,第一層區間長度l,第二層區間開始下標i,並求出結束下標j=i+l,第三層k由i到j-1,狀態轉移方程則為

dp1[i][j]=ma(dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1],dp1[i][j])

及dp2[i][j]=mi(dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1],dp2[i][j])(一大一小)

而由於這題是個環(能量項鍊也是環),so將本題資料由n個擴充套件到2n個,最後搜尋區間長度為n的最大及最小值

下面附上**

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

intn;

9int a[305],sum[305],dp1[305][305],dp2[305][305

];10

11int ma(int a,int b)

12int mi(int a,int b)

1314

intmain()

21for(int i=1;i<=n;i++)

24for(int l=1;l)31}

32}33int ans1=0,ans2=10000000;34

for(int i=1;i<=n;i++)

38 printf("

%d\n%d\n

",ans2,ans1);

39return0;

40 }

嚶嚶嚶新人開博鼓勵一下吧~~

P1880 NOI1995 石子合併

在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別表示每堆石...

P1880 NOI1995 石子合併

在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別表示每堆石...

P1880 NOI1995 石子合併

這次還是給大家講解一下dp 我們則需要根據這個題目的實際含義進行變通即可.而區間dp的大致模板是 for int len 2 len n len for int i 1 i len 1 n i 那講到這裡就很自然 一點都不自然 的引入了今天我們要看的一道題,剛才我已經說了最長不下降子串行是線性dp的...