日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

合并石子 区间dp水题

發布時間:2024/4/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合并石子 区间dp水题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

合并石子?

鏈接: nyoj 737

描述: 有N堆石子排成一排,每堆石子有一定的數量。現要將N堆石子并成為一堆。合并的過程只能每次將相鄰的兩堆石子堆成一堆,每次合并花費的代價為這兩堆石子的和,經過N-1次合并后成為一堆。求出總的代價最小值。tags:最基本的區間dp,這題范圍小,如果n大一些,還是要加個平行四邊行優化。 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<string> using namespace std; typedef long long ll; #define rep(i,a,b) for(int i=a; i<=b; ++i) #define inf 1e18 const int N=1005;int n, a[N]; ll dp[N][N], f[N][N], sum[N][N], sum1[N]; int main() {while(scanf("%d", &n)!=EOF) {rep(i,1,N-1) rep(j,i,N-1) dp[i][j]=inf;rep(i,1,n) scanf("%d", &a[i]), sum1[i]=sum1[i-1]+a[i];rep(i,1,n) rep(j,i+1,n) {sum[i][j]=sum1[j]-sum1[i-1];}rep(i,1,n) f[i][i]=i, dp[i][i]=0;rep(len, 2, n) for(int i=1; i+len-1<=n; ++i){int j=i+len-1;for(int k=f[i][j-1]; k<=f[i+1][j]; ++k){ if(dp[i][j]>dp[i][k]+dp[k+1][j]+sum[i][j]) {dp[i][j]= dp[i][k]+dp[k+1][j]+sum[i][j];f[i][j]=k;}} }printf("%lld\n", dp[1][n]);}return 0; }

轉載于:https://www.cnblogs.com/sbfhy/p/6903667.html

總結

以上是生活随笔為你收集整理的合并石子 区间dp水题的全部內容,希望文章能夠幫你解決所遇到的問題。

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