LintCode "Copy Books"
2015-10-07 15:12
387 查看
Classic DP. The initial intuitive O(k*n^2) solution is like this:
O(nk): http://sidbai.github.io/2015/07/25/Copy-Books/
Point above:
dp[c][i-1] is mono-inc by c, cur is mono-dec. min(.., max(cur,last)) is V-like in 2D plane. So we can use 2-pointers to find the bottom of the V!
Or, binary search with O(nlg(sum/k)): https://github.com/kamyu104/LintCode/blob/master/C++/copy-books.cpp
class Solution { public: /** * @param pages: a vector of integers * @param k: an integer * @return: an integer */ int copyBooks(vector<int> &pages, int k) { size_t n = pages.size(); if(k > n) { return *max_element(pages.begin(), pages.end()); } // Prefix Sums vector<long long> psum(n); for(int i = 0; i < n; i ++) psum[i] = i == 0? pages[i] : (psum[i - 1] + pages[i]); // DP vector<vector<long long>> dp(n + 1, vector<long long>(k + 1, INT_MAX)); for(int i = 1; i <= n; i ++) dp[i][1] = psum[i - 1]; for(int i = 2; i <= k; i ++) // person for(int b = i; b <= n; b ++) // book for(int c = i-1; c < b; c ++) // prev book { long long last = dp[c][i - 1]; long long cur = psum[b-1] - psum[c - 1]; dp[b][i] = min(dp[b][i], max(cur, last)); } return dp [k]; } };
O(nk): http://sidbai.github.io/2015/07/25/Copy-Books/
Point above:
long long last = dp[c][i - 1]; long long cur = psum[b-1] - psum[c - 1]; min(dp[b][i], max(cur, last));
dp[c][i-1] is mono-inc by c, cur is mono-dec. min(.., max(cur,last)) is V-like in 2D plane. So we can use 2-pointers to find the bottom of the V!
Or, binary search with O(nlg(sum/k)): https://github.com/kamyu104/LintCode/blob/master/C++/copy-books.cpp
相关文章推荐
- linux 装 mysql
- 图像变形算法:实现Photoshop液化工具箱中向前变形工具
- DayDayUP_Linux运维学习_LAMP的安装
- Linux rz,sz的安装
- PHP执行shell脚本运行程序不产生core文件
- CentOS Linux解决Device eth0 does not seem to be present及设置固定ip
- Kinect for Windows V2和V1对比开发___骨骼数据获取并用OpenCV2.4.10显示
- 大型网站之分布式会话管理
- shell文字过滤程序(十):cut命令
- Linux GDB 常用命令
- linux之gdb(下)
- 【转】Linux环境下hadoop安装过程
- linux之gdb(上)
- linux之Makefile(上)
- Kinect for Windows V2和V1对比开发___彩色数据获取并用OpenCV2.4.10显示
- linux中ctrl+z和ctrl+c的区别
- Linux 常用netstat命令 实例讲解
- LinuxMint下tty.js的安装指南
- Linux标准错误输出
- linux中断子系统(一) - 注册系统中断处理函数