BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化
咳咳咳,第一次没大看题解做DP
以前的我应该是这样的
哇咔咔,这tm咋做,不管了,先看个题解,再写代码
终于看懂了,卧槽咋写啊,算了还是抄吧
第一问类似于noip的那个跳房子,随便做
这里重点讲第二问
首先,不会做,那就先写暴力
dp当然得写dp暴力了
\(f[k][i]\) 表示选择了k段,到了第i个位置(一共有m+1段)
状态转移方程就是$$f[k][i]=f[k][i]+f[k-1]j$$
for(int i=1;i<=n;++i) {
if(sum[i]<=ans)
f[1][i]=1;
}
for (int k=2;k<=m+1;++k) {
for(int i=k;i<=n;++i) {
for(int j=i;j>=1;--j) {
if(sum[i]-sum[j-1] <= ans) {
f[k][i] += f[k-1][j];
}
}
}
}
三重循环,第一重枚举k,第二重枚举i,第三重枚举j
好了,时间复杂度\(O(n^{2}*m)\),空间复杂度\(O(n*m)\),\(TLE\)(太不良心了,不给暴力分)
空间复杂度的话,很明显可以滚动数组
考虑第三重循环,是上一次转移的一段连续的区间
那么,我们是不是可以把上一他们都前缀和,然后O(1)
那前缀和范围不明确咋办?
我们可以用数组O(n)预处理出来
很明显的 $i>j 则p[i]>=p[j] $,指针从1一直往后挪,挪到n
时间复杂度\((n*m)\),空间复杂度\(O(n)\),优秀(≧▽≦)/
最后,注意边界吧
/**************************************************************
Problem: 1044
User: 3010651817
Language: C++
Result: Accepted
Time:4528 ms
Memory:11052 kb
****************************************************************/
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 5e5 + 7;
const int mod = 10007;
int a[maxn], n, m, l, r;
int sum[maxn], p[maxn];
bool check(int x) {
int js = 0, tot = 0;
for (int i = 1; i <= n; ++i) {
if (tot + a[i] > x) {
js++, tot = 0;
}
tot += a[i];
}
if (tot > x) return 0;
return m >= js;
}
int f[2][maxn];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]), sum[i] = sum[i - 1] + a[i];
r = sum[n];
int ans = 0;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
p[1] = 1;
for (int i = 2; i <= n; ++i) {
p[i] = p[i - 1];
while (sum[i] - sum[p[i] - 1] > ans && p[i] <= i) {
p[i]++;
}
}
for (int i = 1; i <= n; ++i) p[i] = p[i] >= 2 ? p[i] - 2 : 0;
for (int i = 1; i <= n; ++i) {
if (sum[i] <= ans) {
f[1][i] = 1;
}
f[1][i] = f[1][i - 1] + f[1][i];
}
int tot = 0;
for (int i = 2, cnt = 0; i <= m + 1; ++i, cnt ^= 1) {
for (int j = i; j <= n; ++j) {
f[cnt][j] = ((f[cnt][j - 1] + f[cnt ^ 1][j - 1]) % mod + mod - f[cnt ^ 1][p[j]]) % mod;
}
tot = ((tot + f[cnt][n]) % mod + mod - f[cnt][n - 1]) % mod;
}
printf("%d %d\n", ans, tot );
return 0;
}
BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化的更多相关文章
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- bzoj 1044 [HAOI2008]木棍分割——前缀和优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 前缀和优化. 但开成long long会T.(仔细一看不用开long long) #i ...
- [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】
题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...
- bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...
- bzoj 1044: [HAOI2008]木棍分割【二分+dp】
对于第一问二分然后贪心判断即可 对于第二问,设f[i][j]为已经到j为止砍了i段,转移的话从$$ f[i][j]=\sigema f[k][j-1] (s[j]-s[k-1]<=ans) 这里 ...
- BZOJ 1044: [HAOI2008]木棍分割
Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...
- 1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2161 Solved: 779[Submit][Statu ...
- 【BZOJ】1044: [HAOI2008]木棍分割 二分+区间DP
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1044 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, ...
- 【BZOJ】1044: [HAOI2008]木棍分割(二分+dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1044 如果只求最大的最小,,直接二分就行了...可是要求方案.. 好神! 我竟然想不到! 因为我们得 ...
随机推荐
- hibernate注解(三)1+N问题
一.什么时候会遇到1+N的问题? 前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准 ...
- 【Loadrunner】Error -26601: Decompression function 错误解决、27728报错解决方案
一. Error -26601: Decompression function 错误解决 Action2.c(30): Error -26601: Decompression function ...
- 【Pyton】【小甲鱼】爬虫4-XXOO
import urllib.request import os def open_url(url): req=urllib.request.Request(url) req.add_header('U ...
- 怎样在wordpress后台显示日志 ID
有时我们需要在wordpress后台编辑特定的文章,找了大半天眼睛都花了,不禁会吐槽一下.有没有什么办法可以直接在日志列表查看日志 ID 呢?我们可以通过下面的代码实现: <?php /* Pl ...
- 帝国cms底部代码哪里改?要修改版权和统计代码
最近接手的几个站是用帝国cms做的,底部代码那边都有一个**设计的链接,还有一些不相关的东西,第一眼看到就想把那些帝国cms底部代码清理掉,这就是让别人建站的烦恼,让他们删除说要收费,坑就一个字,自己 ...
- java计算器 图形用户界面 升级版 v1.02
package com.rgy.entity; import java.awt.BorderLayout; import java.awt.Font; import java.awt.GridLayo ...
- Failed to load project at 'xxx.xcodeproj', incompatible project version。
Failed to load project at 'xxx.xcodeproj', incompatible project version. 更新最新的xcode,xcode高版本可以打开低版本的 ...
- visual studio code 编辑器的配置及快捷键等, vscode, csc
visual studio code (vsc) 对开发node.js,javascript,python,html,golang等比较友好,同时支持git浏览及分屏对比,运行速度快,所以是值得一用的 ...
- container / pull-left
<div class="container"> <h2>实例</h2> <div class="pull-left"& ...
- Python 之 os.walk()
原文地址https://www.cnblogs.com/JetpropelledSnake/p/8982495.html http://www.runoob.com/python/o ...