ssl1203-书的复制【dp】
生活随笔
收集整理的這篇文章主要介紹了
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】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 任豪是谁 任豪的简介
- 下一篇: ssl1626-花店橱窗布置【日常dp】