Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子歸并 3
時(shí)間限制: 1 s
空間限制: 256000 KB
題目等級(jí) : 鉆石 Diamond
題目描述 Description
有n堆石子排成一列,每堆石子有一個(gè)重量w[i], 每次合并可以合并相鄰的兩堆石子,一次合并的代價(jià)為兩堆石子的重量和w[i]+w[i+1]。問(wèn)安排怎樣的合并順序,能夠使得總合并代價(jià)達(dá)到最小。
輸入描述 Input Description
第一行一個(gè)整數(shù)n(n<=3000)
第二行n個(gè)整數(shù)w1,w2…wn (wi <= 3000)
輸出描述 Output Description
一個(gè)整數(shù)表示最小合并代價(jià)
樣例輸入 Sample Input
4
4 1 1 4
樣例輸出 Sample Output
18
數(shù)據(jù)范圍及提示 Data Size & Hint
數(shù)據(jù)范圍相比“石子歸并” 擴(kuò)大了
分類標(biāo)簽 Tags
動(dòng)態(tài)規(guī)劃 區(qū)間型DP 單調(diào)性DP
Here 證明啥的都講得比較清楚
/* DP四邊形不等式優(yōu)化. 可證得k取[s[i][j-1],s[i+1][j]] 然后n^2搞就好. */ #include<iostream> #include<cstring> #include<cstdio> #define MAXN 3001 using namespace std; int n,m,f[MAXN][MAXN],s[MAXN][MAXN],w[MAXN]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*f; } void slove() { for(int i=1;i<=n;i++) s[i][i]=i; f[0][0]=0; for(int l=1;l<=n-1;l++) for(int i=1;i<=n-l;i++) { int j=i+l; for(int k=s[i][j-1];k<=s[i+1][j];k++) { if(f[i][j]>f[i][k]+f[k+1][j]+w[j]-w[i-1]) { f[i][j]=f[i][k]+f[k+1][j]+w[j]-w[i-1]; s[i][j]=k; } } } } int main() { int x; memset(f,127/3,sizeof f); n=read(); for(int i=1;i<=n;i++) x=read(),w[i]=w[i-1]+x,f[i][i]=0; slove(); printf("%d",f[1][n]); return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/nancheng58/p/10068027.html
總結(jié)
以上是生活随笔為你收集整理的Codevs 3002 石子归并 3(DP四边形不等式优化)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Netty内存池
- 下一篇: mysql 以数组的形式插入更新表