动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途

4518: [Sdoi2016]征途

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 532  Solved: 337
[Submit][Status][Discuss]

Description

Pine开始了从S地到T地的征途。

从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。

Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。

Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。

帮助Pine求出最小方差是多少。

设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。

Input

第一行两个数 n、m。

第二行 n 个数,表示 n 段路的长度

Output

一个数,最小方差乘以 m^2 后的值

Sample Input

5 2
1 2 5 8 6

Sample Output

36

HINT

1≤n≤3000,保证从 S 到 T 的总路程不超过 30000

  还是很简单的。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int maxn=3010;
 6 long long dp[maxn][maxn],s[maxn];
 7 int n,m,p[maxn][maxn];
 8 int main(){
 9 #ifndef ONLINE_JUDGE
10     freopen("menci_journey.in","r",stdin);
11     freopen("menci_journey.out","w",stdout);
12 #endif
13     scanf("%d%d",&n,&m);
14     memset(dp,63,sizeof(dp));
15     for(int i=1;i<=n;i++){
16         scanf("%lld",&s[i]);
17         s[i]+=s[i-1];
18     }
19     dp[0][0]=0;
20     for(int k=1;k<=m;k++){
21         for(int i=k;i<=n;i++){
22             for(int j=p[k][i-1];j<i;j++){
23                 if(dp[k][i]>dp[k-1][j]+(s[i]-s[j])*(s[i]-s[j])){
24                     dp[k][i]=dp[k-1][j]+(s[i]-s[j])*(s[i]-s[j]);
25                     p[k][i]=j;
26                 }
27             }
28         }
29     }
30     printf("%lld\n",1ll*dp[m][n]*m-s[n]*s[n]);
31     return 0;
32 }
时间: 2024-08-02 20:15:15

动态规划(决策单调优化):BZOJ 4518 [Sdoi2016]征途的相关文章

BZOJ 4518 [Sdoi2016]征途(分治DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] 化简式子可以发现,就是求将数列分成m段,最小化和的平方和.设dp[i][j]表示处理到第i段,已经用了前j个数的最小代价,我们可以得到dp[i][j]=min(dp[i-1][k]+(s[j]-s[k])2),由于决策单调,可以分治DP. [代码] #include <cstdio> typede

bzoj 4518 [Sdoi2016]征途 (斜率优化DP)

我犯了sb错误然后调了1个小时......队列写错了 斜率k递增,b取最小值,队列维护凸包即可 f[0]的预处理好像有些奇怪???我把inf调大就过了??? 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #define il inline 5 #define ll long long 6 #define N 3010 7 #define inf 66666666 8 using nam

●BZOJ 4518 [Sdoi2016]征途

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4518 题解: 斜率优化DP 首先看看最后答案的形式: 设a[i]为第i天走的距离,那么 $ANS=\frac{\sum_{i=1}^{M}(a[i]-\overline{x})^2}{M}\times{M^2}$ $\;\qquad=\frac{(\sum_{i=1}^{M}a[i]^2)-2\overline{x}SUM+M\overline{x}^2}{M}\times{M^2}$ $

bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小. 帮助Pine求出最小方差是多少. 设方差是v,可以证明,v×m^2是一个整数.为了避免精度误差,输出结果时输出v×m^2. In

bzoj4518[Sdoi2016]征途 斜率优化dp

4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status][Discuss] Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以

BZOJ4513~4518 SDOI2016 R1 题解

4513: [Sdoi2016]储能表 数位dp,f[i][2][2][2]表示前i位,是否卡n的上界,是否卡m的上界,是否卡k的下界,枚举每一维的下一位直接转移. #include<cstdio> #include<cstring> typedef unsigned u32; typedef long long ll; ll x,y,z; int p,q; u32 f[61][2][2][2][2]; int main(){ scanf("%d",&q

[Sdoi2016]征途

4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1125  Solved: 623[Submit][Status][Discuss] Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以

【BZOJ4518】[Sdoi2016]征途 斜率优化

[BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小. 帮助Pine求出最小方差是多少. 设方差是v,可以证明,v×m^2是一个整数.为了避免精度误差,输出结果时输出v×m^2. Inpu

动态规划几种优化方式

动态规划确实是很考验思维的一类题目,有时候想到设计状态和状态转移方程还不够,还得想到它的优化方式.有的优化方式比较显然,更多的并不显然而且要依靠其他知识和外部数据结构.尽管十分灵活,但是最重要的其实也只有几种,总结经验能让我们更好地应对这个问题. 墙裂推荐博客:https://www.cnblogs.com/flashhu/p/9480669.html 蒟蒻博主也没有什么新见解啦,更多是对上面博客的一个题目集合题解.(这部分知识对博主来说还是有点难,陆陆续续学习更新吧.) 前缀和优化: 洛谷P2