POJ1505:Copying Books(区间DP)
Description
Once upon a time, there was a theater ensemble that wanted to play famous Antique Tragedies. The scripts of these plays were divided into many books and actors needed more copies of them, of course. So they hired many scribers to make copies of these books. Imagine you have m books (numbered 1, 2 ... m) that may have different number of pages (p1, p2 ... pm) and you want to make one copy of each of them. Your task is to divide these books among k scribes, k <= m. Each book can be assigned to a single scriber only, and every scriber must get a continuous sequence of books. That means, there exists an increasing succession of numbers 0 = b0 < b1 < b2, ... < b
k-1 <= bk = m such that i-th scriber gets a sequence of books with numbers between bi-1+1 and bi. The time needed to make a copy of all the books is determined by the scriber who was assigned the most work. Therefore, our goal is to minimize the maximum number of pages assigned to a single scriber. Your task is to find the optimal assignment.
Input
Output
If there is more than one solution, print the one that minimizes the work assigned to the first scriber, then to the second scriber etc. But each scriber must be assigned at least one book.
Sample Input
2
9 3
100 200 300 400 500 600 700 800 900
5 4
100 100 100 100 100
Sample Output
100 200 300 400 500 / 600 700 / 800 900
100 / 100 / 100 / 100 100
题意:有一个序列的书分给n个人,区间最大的最小,有多重分法,就让和大的区间尽量靠后
思路;明显的区间DP
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int dp[505][505],sum[505],a[505]; int main()
{
int t,n,m,i,j,x,v,cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&m);
memset(sum,0,sizeof(sum));
memset(dp,-1,sizeof(dp));
for(i = 1; i<=n; i++)
{
scanf("%d",&x);
sum[i] = sum[i-1]+x;
}
dp[0][0] = 0;
for(i = 1; i<=n; i++)
{
for(j = 1; j<=i && j<=m; j++)
{
if(j == 1)
dp[i][j] = sum[i];
else
{
for(v = j-1; v<=i-1; v++)//
{
int t = max(dp[v][j-1],sum[i]-sum[v]);
if(dp[i][j] == -1 || t<dp[i][j])
dp[i][j] = t;
}
}
}
}
j = m-1;
x = 0;
for(i = n; i>=1; i--)
{
x+=sum[i]-sum[i-1];
if(x>dp[n][m] || i<=j)
{
a[j--] = i+1;
x = sum[i]-sum[i-1];
}
}
int cnt = 1;
for(i = 1; i<=n; i++)
{
if(i>1)
printf(" ");
if(cnt<m && a[cnt]==i)
{
printf("/ ");
cnt++;
}
printf("%d",sum[i]-sum[i-1]);
}
printf("\n");
} return 0;
}
POJ1505:Copying Books(区间DP)的更多相关文章
- POJ1505 Copying Books(二分法)
B - 二分 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description Be ...
- POJ1505&&UVa714 Copying Books(DP)
Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 7109 Accepted: 2221 Descrip ...
- lightoj 1283 - Shelving Books(记忆化搜索+区间dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1283 题解:这题很显然一看就像是区间dp,但是单纯的区间dp好像解决不了问题可 ...
- poj 1505 Copying Books
http://poj.org/problem?id=1505 Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submiss ...
- Copying Books
Copying Books 给出一个长度为m的序列\(\{a_i\}\),将其划分成k个区间,求区间和的最大值的最小值对应的方案,多种方案,则按从左到右的区间长度尽可能小(也就是从左到右区间长度构成的 ...
- UVa 714 Copying Books(二分)
题目链接: 传送门 Copying Books Time Limit: 3000MS Memory Limit: 32768 KB Description Before the inventi ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
随机推荐
- public static <T> Map<String, T> json2map
/** * json string convert to map with javaBean */ public static <T> Map<String, T> json2 ...
- (转)C#文件操作
原文连接:http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html 文件与文件夹操作主要用到以下几个类: 1.File类: 提 ...
- SQL后台分页三种方案和分析
建立表:CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) CO ...
- 03C#基础(2)
1.比较运算符 ==等于; !=不等于; >大于; >=大于或者等于; <小于; <=小于或者等于; 比较运算符(又称关系运算符)用来进行值得真假性判断,结果是boo ...
- XML约束图解
- PLSQL Package dubug方法
初步接触EBS代码修改,花了几个小时搞明白了Package的debug方法, 1.打开需要测试的package,找到需要测试的过程,右键选择测试 2.在测试窗口中初始化过程的入参,点击测试按钮开始调试 ...
- 【CEOI2004】锯木厂选址
[题目描述] 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂.木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂.另外两个 ...
- 安装 php
1.yum安装php yum install php 2.配置 apache 支持 php a.找到httpd.conf find / -name httpd.conf b.编辑 httpd.con ...
- Extjs中numberfield小数位数设置
在默认的情况下,使用numberfield控件时只会显示两位小数,有的时候需要根据业务来确定显示小数的位数.通过设置下面的属性可以达到我们想要的目的: text : '存煤量(万吨)', dataIn ...
- 逻辑很重要:一句sql语句的事,自己却想了半天,绕了个大弯子
问题:系统升级后审核认证信息分别写入两个表,现在需要链接用户表和相应的新旧审核表获取字段值? 钻进胡同里:一直纠结于升级之后的会员信息从新表查,升级之前的数据从旧表查,纠结于根据时间戳分条件判断, 其 ...