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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

维修栅栏【DP】

發布時間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 维修栅栏【DP】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

維修柵欄

題目大意:

有一串數,要把這一串數改成全部非0的,每一次可以更改某一段的全部數字,但有代價sqrt(m)sqrt(m)sqrt(m)(m為當前子串的長度)

原題:

題目描述

農場的柵欄年久失修,出現了多處破損,晶晶準備維修它,柵欄是由n塊木板組成的,每塊木板可能已經損壞也可能沒有損壞。晶晶知道,維修連續m個木板(這m個木板不一定都是損壞的)的費用是sqrt(m)。可是,怎樣設計方案才能使總費用最低呢?請你寫程序幫忙計算。

輸入

第一行包含一個整數n(n<=2500),表示柵欄的長度。
第二行包含n個由空格分開的整數(-1000~1000),如果第i個數是0,則表示第i塊木板已經損壞,否則表示沒損壞。

輸出

一個實數,表示最小維修費用。
注意:答案精確到小數點后3位。

輸入樣例

9 0 -1 0 1 2 3 0 -2 0

輸出樣例

3.000

解題思路:

直接DP,枚舉每一次的子串,如果子串內有0那修,否則不修

代碼:

#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #define ld long double using namespace std; int n,x,b[3000]; ld f[3000]; ld minn(ld aa,ld bb) {if (aa<bb) return aa;return bb; } int main() {scanf("%d",&n);for (int i=1;i<=n;++i){scanf("%d",&x);if (!x) b[i]++;b[i]+=b[i-1];//前綴和}memset(f,0x7f,sizeof(f));f[0]=0;for (int i=1;i<=n;++i){for (int j=0;j<i;++j)if (b[i]==b[j]) f[i]=minn(f[i],f[j]);//判斷有沒有0,沒有直接賦值else f[i]=minn(f[i],f[j]+sqrt((ld)(i-j)));//有則全部改變}printf("%.3Lf",f[n]);return 0; }

總結

以上是生活随笔為你收集整理的维修栅栏【DP】的全部內容,希望文章能夠幫你解決所遇到的問題。

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