zoukankan      html  css  js  c++  java
  • 动态规划(决策单调优化):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
    ",1ll*dp[m][n]*m-s[n]*s[n]);        
    31     return 0;
    32 }
    尽最大的努力,做最好的自己!
  • 相关阅读:
    小议如何使用APPLY
    SQLServer复制(二)--事务代理作业
    T-SQL—理解CTEs
    jdbc与java.sql
    java设计模式之中介者模式
    fread函数和fwrite函数
    Linux多线程编程(不限Linux)
    poj 3320 技巧/尺取法 map标记
    poj 1260 dp
    HDU 4311 前缀和
  • 原文地址:https://www.cnblogs.com/TenderRun/p/5577468.html
Copyright © 2011-2022 走看看