【TOJ 2211】Copying Books【DP】
来源:互联网 发布:招聘游戏程序员 编辑:程序博客网 时间:2024/05/29 17:54
题意:给出n个数字,将其分成m连续块,使得连续和最大的最小。
思路:DP[i][j]表示前i个数字被分成j个的最优值。
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;#define N 510ll val[N], sum[N];ll dp[N][N];int ans[N];int main() {int T, n, m, i, j, k;scanf("%d", &T);while (T--) {scanf("%d%d", &n, &m);sum[0] = 0;for (i = 1;i <= n;i++) {scanf("%lld", &val[i]);sum[i] = sum[i-1]+val[i];}memset(dp, -1, sizeof(dp));dp[0][0] = 0;for (i = 1;i <= n;i++) dp[i][1] = sum[i];for (i = 1;i <= n;i++) {for (j = 2;j <= i && j <= m;j++) {for (k = j-1;k < i;k++) { int tm = max(dp[k][j-1], sum[i]-sum[k]); if (dp[i][j] == -1 || dp[i][j] > tm) dp[i][j] = tm;}}}ll x = 0;j = m-1; for (i = n;i >= 1;i--) { x += val[i]; if (x > dp[n][m] || i <= j) { ans[j--] = i+1; x = val[i]; } } j = 1;for (i = 1;i < n;i++) { printf("%d ", val[i]); if (j < m && ans[j] == i+1) { j++; printf("/ "); }}printf("%d\n", val[n]);}}
0 0
- 【TOJ 2211】Copying Books【DP】
- POJ1505:Copying Books(区间DP)
- POJ1505&&UVa714 Copying Books(DP)
- Copying Books - UVa 714 dp
- POJ1505 Copying Books(dp)
- ZJU2002 Copying Books - 二分+贪心大败DP
- POJ1505&&UVa714 Copying Books(DP)
- poj 1505 Copying Books (dp+路径打印)
- POJ 题目1505 Copying Books(DP,打印路径)
- POJ 1505 Copying Books
- poj 1505 Copying Books
- uva 714 Copying Books
- poj 1505 Copying Books
- PKU 1505 Copying Books
- UVa 714 - Copying Books
- uva 714 - Copying Books
- uva 714 - Copying Books
- 714 - Copying Books
- 说说Web Service
- hdu1272- 小希的迷宫
- POJ 1405 Heritage(高精度)
- poj 2396 有下界的最大流(填充矩阵)
- 智能家居远程监控系统的设计及实现
- 【TOJ 2211】Copying Books【DP】
- CI持续集成服务器搭建创建bot服务实现自动构建
- 用link方式在Eclipse中安装SVN
- 利用resteasy框架构建rest webservice----第五波:java代码调用乱码解决方案
- HDU 1231 最大连续子序列
- 排列组合中的分组问题
- free和delete把指针怎么啦?
- 当爬虫被拒绝时(Access Denied)
- Android 使用开源库StickyGridHeaders来实现带sections和headers的GridView显示本地图片效果