题目链接

咳咳咳,第一次没大看题解做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 前缀和优化的更多相关文章

  1. BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)

    第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...

  2. bzoj 1044 [HAOI2008]木棍分割——前缀和优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 前缀和优化. 但开成long long会T.(仔细一看不用开long long) #i ...

  3. [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】

    题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...

  4. bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...

  5. bzoj 1044: [HAOI2008]木棍分割【二分+dp】

    对于第一问二分然后贪心判断即可 对于第二问,设f[i][j]为已经到j为止砍了i段,转移的话从$$ f[i][j]=\sigema f[k][j-1] (s[j]-s[k-1]<=ans) 这里 ...

  6. BZOJ 1044: [HAOI2008]木棍分割

    Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...

  7. 1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2161  Solved: 779[Submit][Statu ...

  8. 【BZOJ】1044: [HAOI2008]木棍分割 二分+区间DP

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1044 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, ...

  9. 【BZOJ】1044: [HAOI2008]木棍分割(二分+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1044 如果只求最大的最小,,直接二分就行了...可是要求方案.. 好神! 我竟然想不到! 因为我们得 ...

随机推荐

  1. 用Monitor简单3步监控中间件ActiveMQ

    Apache ActiveMQ是一个基于JMX规范的纯Java消息中间件,它为应用系统提供高效.灵活的消息同步与异步传输处理.存储转发.可靠传输的特性. 消息队列对于应用的健康运行非常重要,作为运维人 ...

  2. extjs分页

    1.本地分页:设置store的proxy属性为pagingmemoryproxy实例 2.远程分页

  3. extjs错误,看到红色才能让自己记住知识点

    1.Cannot call method 'getColumnCount' of undefined Hi, maybe you use colModel before rendering.Notic ...

  4. 为什么要用Markov chain Monte Carlo (MCMC)

    马尔科夫链的蒙特卡洛采样的核心思想是构造一个Markov chain,使得从任意一个状态采样开始,按该Markov chain转移,经过一段时间的采样,逼近平稳分布stationary distrib ...

  5. javascript产生对象(不建议看)

    产生对象的方式:一.new+构造函数1.JavaScript的内置构造函数,如Date(),Function(),Array(),Object()2.自定义的构造函数二.对象字面量{}三.继承 用 v ...

  6. linux eaccelerator

    wget https://github.com/eaccelerator/eaccelerator/tarball/master tar -jxvf eaccelerator-0.9.6.1.tar. ...

  7. XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

    以下是代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  8. Webform和MVC,为什么MVC更好一些?(转)

    转自http://www.admin10000.com/document/5277.html 前言 如果你看了最近微软的议程,你会发现他们现在的焦点除了MVC,还是MVC.问题在于为什么微软如此热衷于 ...

  9. VCS中的覆盖率分析

    VCS在仿真过程中,也可以收集Coverage Metric.其中覆盖率类型有: 1)Code Coverage:包括control_flow和value两部分的coverage,line_cover ...

  10. EF Code First学习笔记 初识Code First(转)

    Code First是Entity Framework提供的一种新的编程模型.通过Code First我们可以在还没有建立数据库的情况下就开始编码,然后通过代码来生成数据库. 下面通过一个简单的示例来 ...