日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Codevs 3002 石子归并 3(DP四边形不等式优化)

發布時間:2025/3/20 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codevs 3002 石子归并 3(DP四边形不等式优化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

3002 石子歸并 3
時間限制: 1 s
空間限制: 256000 KB
題目等級 : 鉆石 Diamond
題目描述 Description
有n堆石子排成一列,每堆石子有一個重量w[i], 每次合并可以合并相鄰的兩堆石子,一次合并的代價為兩堆石子的重量和w[i]+w[i+1]。問安排怎樣的合并順序,能夠使得總合并代價達到最小。
輸入描述 Input Description
第一行一個整數n(n<=3000)
第二行n個整數w1,w2…wn (wi <= 3000)
輸出描述 Output Description
一個整數表示最小合并代價
樣例輸入 Sample Input
4
4 1 1 4
樣例輸出 Sample Output
18
數據范圍及提示 Data Size & Hint
數據范圍相比“石子歸并” 擴大了
分類標簽 Tags
動態規劃 區間型DP 單調性DP

Here 證明啥的都講得比較清楚

/* DP四邊形不等式優化. 可證得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; }

轉載于:https://www.cnblogs.com/nancheng58/p/10068027.html

總結

以上是生活随笔為你收集整理的Codevs 3002 石子归并 3(DP四边形不等式优化)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。