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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ssl1203-书的复制【dp】

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

題目

現在要把m本有順序的書分給k個人復制(抄寫),每個人的抄寫速度都一樣,一本書不允許分給兩個或兩個以上的人抄寫,分給每個人的書,必須是連續的,比如不能把第一、第三、第四本書給同一個人抄寫。
現在請你設計一種方案,使得復制時間最短。復制時間為抄寫最多的人用去的時間。


輸入

第一行兩個整數,m,k(k<=m<=500)
第二行為m個整數,第i個數表示第i本書的頁數。

輸出

最短時間


輸入樣例

9 3
1 2 3 4 5 6 7 8 9

輸出樣例

17

解題思路

這道題我們可以用f[i][j]表示前i個人抄前j本書的最大時間,然后我們可以枚舉抄的位置。列出動態轉移方程f[i][j]=min(max(f[i-1][k],s[j]-s[k]),f[i][j])


代碼

#include<cstdio> #include<iostream> using namespace std; int n,m,s[501],f[501][501],x,maxs; int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%d",&x);s[i]=s[i-1]+x;//前綴和,這樣就可以用s[j]-s[i-1]求到i到j個數的值}memset(f,127/3,sizeof(f));//賦值一個很大的整數for (int i=0;i<=n;i++) f[1][i]=s[i];//只給一個人抄的工作量for (int i=2;i<=m;i++){//插入第i個人for (int j=1;j<=n;j++){//枚舉前j本書for (int k=1;k<j;k++){//枚舉插入位置f[i][j]=min(max(f[i-1][k],s[j]-s[k]),f[i][j]);//max(f[i-1][k],s[j]-s[k])表示求插在當前位置時的最大時間//然后求該段的最小值}}}printf("%d",f[m][n]);//輸出 }

總結

以上是生活随笔為你收集整理的ssl1203-书的复制【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

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