博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【POJ】1505 Copying Books
阅读量:6111 次
发布时间:2019-06-21

本文共 1803 字,大约阅读时间需要 6 分钟。

此题主要采用DP思路,难点是求解"/",需要考虑划分数量不够的情况,先采用DP求解最优解,然后采用贪心求解slash。防止中间结果出错,使用了unsigned int。

#include 
using namespace std;#define MAXNUM 501unsigned int pages[MAXNUM][MAXNUM];int main() { int case_n, m, k; int i, j, p, q; unsigned min, tmp, sum; cin >>case_n; for (p=1; p<=case_n; ++p) { cin >>m>>k; for (i=1; i<=m; ++i) cin >>pages[0][i]; // handle the One worker case pages[1][1] = pages[0][1]; for (i=2; i<=m ;++i) pages[1][i] = pages[0][i] + pages[1][i-1]; for (i=2; i<=k; i++) { for (j=1; j<=m; j++) { if (i>j) { pages[i][j] = pages[i-1][j]; } else { min = pages[i-1][j]; sum = 0; for (q=j-1; q>=i-1; q--) { sum += pages[0][q+1]; tmp = (sum > pages[i-1][q]) ? sum : pages[i-1][q]; if (tmp <= min) min = tmp; else break; } pages[i][j] = min; } } } bool slash[MAXNUM] = {
false}; int slash_num = 0; sum = 0; for (i=m; i>=1; i--) { if (sum + pages[0][i] > pages[k][m]) { slash[i] = true; slash_num++; sum = pages[0][i]; } else { sum += pages[0][i]; } } if (slash_num < k-1) { for (i=1; i<=m && slash_num != k-1; i++) { if ( !slash[i] ) { slash[i] = true; slash_num++; } } } for (i=1; i

 

转载于:https://www.cnblogs.com/bombe1013/p/3573865.html

你可能感兴趣的文章
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>