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 ...
随机推荐
- 什么是mimeType?
因特网多媒体邮件扩展标示内容是什么格式.告诉浏览器或者server如何解析该数据http的请求和相应都含有一个mimeType字段 =>content-type(通用首部)
- ASPNET5应用程序启动
1. 启动类 在asp.net5当中,Startup类提供应用程序的入口,对所有应用程序是必须的.争对特定环境的配置的starup class和方法也是有可能的, 但是,不管怎样, 一个Startup ...
- windowIsTranlucent 属性
项目中踩的大坑. 先埋. int alwaysFinish = 0; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERS ...
- IMP数据文件时ORA-00959错误分析
有时间模拟一下ORA-00959的测试分析.
- dom4j 笔记【转】
SAXReader reader = new SAXReader(); Document doc = reader.read(...); List childNodes = doc.selectNod ...
- (转)C++静态库与动态库
本文出自 http://www.cnblogs.com/skynet/p/3372855.html 吴秦 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不 ...
- Java学习-----单例模式
一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢:如果构造方法是private的话,那么有什么好处呢:如果构造方法是privat ...
- C# 构造函数如何调用父类构造函数或其他构造函数
class C : B{ C() : base(5) // call base constructor B(5) { } C(int i) : this() // ca ...
- jdk-动态代理
1.HelloWorld package reflect.proxy; public interface HelloWorld { void print(); } 2.HelloWorldImpl p ...
- Black Box
http://poj.org/problem?id=1442 #include<cstdio> #include<algorithm> #include<queue> ...