經典題目 合併石子

2021-07-25 13:00:29 字數 1598 閱讀 2147

原題鏈結

很經典的一道題目。

洛谷上算是乙個提高了一點難度的變式?(環形+求最大值+求最小值)

大體思路是列舉區間長度,長度為1的區間的耗費可知,那麼可以推得長度為2的區間的最小/最大耗費,接下來一直列舉到長度為n即可。

錯誤**

#include

#include

#include

#include

#include

#include

using namespace std;

int m,n,i,j,p,k,a[105],f1[105][105],f2[105][105],s[105],ans1=999999999,ans2;

//這裡因為原題給的資料範圍是100,就想當然的開了個105……然而!我們的陣列是要加!倍!的!

int main()

for(i=n+1;i<=2*n;i++)

for(p=1;p<=n-1;p++)

for(i=1;i<=2*n-p;i++)

f1[i][j]=f1[i][j]+s[j]-s[i-1];

f2[i][j]=f2[i][j]+s[j]-s[i-1];

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

printf("%d\n%d",ans1,ans2);

return 0;

}

更正

#include

#include

#include

#include

#include

#include

using namespace std;

int m,n,i,j,p,k,a[205],f1[205][205],f2[205][205],s[205],ans1=999999999,ans2;

int main()

for(i=n+1;i<=2*n;i++)

for(p=1;p<=n-1;p++)

for(i=1;i<=2*n-p;i++)

f1[i][j]=f1[i][j]+s[j]-s[i-1];

f2[i][j]=f2[i][j]+s[j]-s[i-1];

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

printf("%d\n%d",ans1,ans2);

return 0;

}

附上簡單**

#include

#include

#include

#include

#include

#include

using

namespace

std;

int m,n,i,j,p,k,a[105],f[105][105],s[105];

int main()

for(p=1;p<=n-1;p++)

for(i=1;i<=n-p;i++)

printf("%d",f[1][n]);

return

0;}

經典dp 石子合併

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的數量,例如 13 7 8 16 21 4 18 現要將n堆石子歸併為一堆。歸併的過程為每次只能將相鄰的兩堆石子堆成一堆,這樣經過n 1次歸併之後最後成為一堆。對於上面的7堆石子,可以有多種方法歸併成一堆。其中的2種方法入下圖 歸併的代價是...

經典 區間dp 合併石子

題目鏈結 這個動態規劃的思是,要得出合併n堆石子的最優答案可以從小到大列舉所有石子合併的最優情況,例如要合併5堆石子就可以從,最優的2 3和1 4中得到最佳的答案。從兩堆最優到三堆最優一直到n堆最優。狀態轉移方程式 dp i j min dp i k dp k 1 j 複雜度為o n 3 inclu...

區間DP經典 石子合併

題目鏈結 題意 環形的一群石子,每次可以選擇相鄰的兩堆合併,分數為新得到的一堆石子,求將這片石子合併成一堆的最大和最小分數 輸入 第一行乙個正整數n,其後n個數代表每堆石子的個數 分析 第一次寫的時候我想當然的寫的狀態轉移方程是dpx l r max dpx l 1 r a l r dpx l r ...