题目链接

咳咳咳,第一次没大看题解做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. AppFog使用

    cd ‘你的应用目录’ af login(之后输入你的邮箱和密码) af update ‘你的应用名’ 相关文档:https://docs.appfog.com/getting-started/af- ...

  2. redhat7下对用户账户的管理

    redhat7对用户帐号的管理主要集中在新建,删除和修改三个动作. 1.新建用户 通过useradd --help,我们得到useradd的详细参数. -d 目录 指定用户主目录,如果此目录不存在,则 ...

  3. django的serializers

    views.py # get所需的 from snippets.serializers import SnippetSerializer from rest_framework.views impor ...

  4. 微信小程序----团购或秒杀的批量倒计时实现

    效果图 实现思路微信小程序实现倒计时,可以将倒计时的时间进行每一秒的计算和渲染! JS模拟商品列表数据 goodsList:在 onLoad 周期函数中对活动结束时间进行提取:建立时间格式化函数 ti ...

  5. 使用Python2.7 POST 数据到 onenet 平台

    功能 发送数据名称为SENSORID(这里用TEST测试),数值为VALUE(这里用49值做测试)的数据,发送到自己的onenet对应设备 效果发送成功 代码 # -*- coding: utf-8 ...

  6. liferay中如何实现自己定义的方法

    大家看到这篇文章是不是很开心啊,我感觉是很开心,我们终于可以按照自己的意愿来写一次代码,在liferay中一些基本的增删改查的代码是自动生成的,然而我们想要实现自己的方法的话,恐怕要费一点劲,你要知道 ...

  7. 透过面试题来说说Promise

    前言 我们先看看这几个来自大厂的面试题 面试题1: const promise = new Promise(function(resolve,reject){ console.log(1) resol ...

  8. 改变 select下拉框 样式

    select{ outline: none; text-indent: 10px; height: 45px; line-height: 45px; width: 100%; border:1px s ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON TestRegionPoint2

    zw版[转发·台湾nvp系列Delphi例程]HALCON TestRegionPoint2 procedure TForm1.Button1Click(Sender: TObject);var op ...

  10. Excel导出插件-VSTO

    前言 一个游戏通常需要10多个Excel表格或者更多来配置,一般会通过导出csv格式读取配置. 本文提供导出Excel直接生成c#文件,对应数据直接生成结构体和数组,方便开发排错和简化重复写每个表格的 ...