原題鏈結
很經典的一道題目。
洛谷上算是乙個提高了一點難度的變式?(環形+求最大值+求最小值)
大體思路是列舉區間長度,長度為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 ...