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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NYOJ737 石子合并(一)区间动态规划

發(fā)布時(shí)間:2024/10/6 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NYOJ737 石子合并(一)区间动态规划 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

石子合并(一)

時(shí)間限制:1000 ms ?|? 內(nèi)存限制:65535 KB

難度:3

描述

????有N堆石子排成一排,每堆石子有一定的數(shù)量?,F(xiàn)要將N堆石子并成為一堆。合并的過程只能每次將相鄰的兩堆石子堆成一堆,每次合并花費(fèi)的代價(jià)為這兩堆石子的和,經(jīng)過N-1次合并后成為一堆。求出總的代價(jià)最小值。

輸入

有多組測(cè)試數(shù)據(jù),輸入到文件結(jié)束。
每組測(cè)試數(shù)據(jù)第一行有一個(gè)整數(shù)n,表示有n堆石子。
接下來的一行有n(0< n <200)個(gè)數(shù),分別表示這n堆石子的數(shù)目,用空格隔開

輸出

輸出總代價(jià)的最小值,占單獨(dú)的一行

樣例輸入

3 1 2 3 7 13 7 8 16 21 4 18

樣例輸出

9 239

來源

經(jīng)典問題

分析

第一步:確定狀態(tài)

f[i,j]表示合并ij的所有石子的得分

第二步:確定狀態(tài)轉(zhuǎn)移方程

f[i,j] = max(f[i][j]f[i][k] + f[k + 1][j] + sum[i][j])

sum[i][j] 表示ij的石子的價(jià)值和。邊界:f[i][i] = 0

#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f //#define inf 1<<20 const int maxn=210; int n,a[maxn]; int dp[maxn][maxn];//dp[i][j]表示從第i堆到第j堆合并的代價(jià) int sum[maxn][maxn];//表示石頭的數(shù)量 int main() {ios::sync_with_stdio(0);while(cin>>n){for(int i=1;i<=n;i++)cin>>a[i];memset(sum,0,sizeof(sum));//fill(dp[0],dp[0]+n*n,inf);//錯(cuò)誤 fill(dp[0],dp[0]+maxn*maxn,inf);//fill填充量必須是常數(shù) /*for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)//dp[i][j]=inf; */ for(int i=1;i<=n;i++)sum[i][i]=a[i],dp[i][i]=0;for(int len=1;len<n;len++){//區(qū)間長度 for(int i=1;i<=n&&i+len<=n;i++){//區(qū)間起點(diǎn) int j=i+len;//區(qū)間終點(diǎn)for(int k=i;k<=j;k++)//用k來表示分割區(qū)間 {sum[i][j]=sum[i][k]+sum[k+1][j];dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);} }}cout<<dp[1][n]<<endl;}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的NYOJ737 石子合并(一)区间动态规划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。