题目:(非常经典的模拟赛题,适合动规入门的OIer)

简要分析:

  动态规划,用一维数组 f[i] 表示从位置1 到 位置i 的最优花费 ,由于 f[i ] 以前的最优花费都是确定的,故只需要在 1 to i 中 枚举变量 j 用来分段.即 把 Q[1 , i ]分为了 Q[1 , j ] + Q[ j+1 , i].其中Q[ 1 , j ]已经被算出,而 Q[ j+1 , i ]又能很轻易的由题目所给公式得到,状态转移方程 f[ i ] = min { f[j-1] + k + ( i-j+1 )*(max[i,j]-min[i,j]) | i-j>m ,j >=1,j<=i  }.

代码实现:

1.朴素动规,即老老实实的 把 max[i,j] 和 min[i,j]给预处理出来,可能会爆内存,不能得全分,但建议阅读:

 namespace last
 { //笼统预处理版本
  << ;
 int n, k, m;
 long long a[(int)4e4];
 ][(], fmin[(][(];
 long long f[(int)4e4];
 int main()
 {
     cin >> n >> m >> k;
     ; i <= n; i++)
         cin >> a[i], f[i] = i * k;
     ; i <= n; i++)
     { //预处理出区间极值
         fmax[i][i] = fmin[i][i] = a[i];
         ; j <= n; j++)
         {
             fmax[i][j] = max(fmax[i][j - ], a[j]);
             fmin[i][j] = min(fmin[i][j - ], a[j]);
         }
     }
     f[] = k; //初始化
     ; i <= n; i++)
     {
         f[i]=1e+;
         , ); j <= i; j++) //简单的状态转移
             f[i] = min(f[i], f[j - ] + k + (i - j + ) * (fmax[j][i] - fmin[j][i]));
     }
     cout << f[n] << endl;
     //system("pause");
     ;
 }
 }

2.在状态转移时求出当前 max,min,为了使max,min适用于 Q[ j , i ],因此枚举 j 时采用倒序:

 namespace newn
 { //更巧妙的方法
     int a[maxn], n, m, k;
     lnt f[maxn];

     int main()
     {
         scanf("%d%d%d", &n, &m, &k);
         ; i <= n; i++)
             scanf("%d", &a[i]);
         ; i <= n; i++)
         {
             f[i] = 1e18;
             , mn = 1e9; //可以边走边算最值,不用预处理,但需要逆序
             ; j--)
             {
                 if (a[j] < mn)
                     mn = a[j];
                 if (a[j] > mx)
                     mx = a[j];
                 f[i] = min(f[i], f[j - ] + k + 1ll * (mx - mn) * (i - j + ));
             }
         }
         printf("%lld\n", f[n]);
         //system("pause");
     }
 }

3.最后给出主函数(其实没必要的)

 int main()
 {
     /**/ freopen("toy.in", "r", stdin);
     freopen("toy.out", "w", stdout); /**/
     last::main();
     newn::main();
     ;
 }

4.总结一下,动规也是非常有技巧性的

[NOIP]玩具装箱的更多相关文章

  1. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  2. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  3. C++之路进阶——codevs1319(玩具装箱)

    1319 玩具装箱  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description P教授要去看奥运,但是他舍不下他的玩具,于是 ...

  4. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

  5. 【BZOJ】【1010】【HNOI2008】玩具装箱Toy

    DP/斜率优化 根据题目描述很容易列出动规方程:$$ f[i]=min\{ f[j]+(s[i]-s[j]+i-j-1-L)^2 \}$$ 其中 $$s[i]=\sum_{k=1}^{i} c[k] ...

  6. 【bzoj1010】[HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9281  Solved: 3719[Submit][St ...

  7. 【斜率DP】BZOJ 1010:玩具装箱

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7537  Solved: 2888[Submit][St ...

  8. BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\ ...

  9. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

随机推荐

  1. Django中添加富文本编辑器

    使用的是CKeditor这个模块 1.安装: pip install django-ckeditor 2.将ckeditor注册到settings.py文件中, 并添加ckeditor的url到你项目 ...

  2. PHP windowns安装扩展包

    1.  php_msgpack.dll php.ini 添加  extension=php_msgpack.dll 下载dll: http://pecl.php.net/package/msgpack ...

  3. mybatis的搭建和注入spring的方式

    mybatis实际上是一个更多关注sql语句的框架,他的出现是想让开发者更简单的去操作数据库. 与hibernate相比较,hibernate更多的是去sql化,虽然hibernate也可以本地sql ...

  4. OpenWRT 添加应用程序开机启动方法

    方法一:在/etc/inid.d/目录下新建启动脚本. 方法二:直接在/etc/rc.local 中添加启动命令,如:./usr/bin/relay &

  5. MySQL比like语句更高效的写法locate position instr find_in_set

    使用内部函数instr,可代替传统的like方式查询,并且速度更快. instr函数,第一个参数是字段,第二个参数是要查询的串,返回串的位置,第一个是1,如果没找到就是0. 例如, select na ...

  6. Android 6.0 双向通话自动录音

    package com.example.hgx.phoneinfo60.Recording; import android.content.BroadcastReceiver; import andr ...

  7. intelliJ IDEA安装、激活与汉化

    1.去intelliJ IDEA 官网下载idea,选择Ultimate版本(非免费版,community免费但功能较少) 2.开始安装 3.选择好路径 4.选择在桌面创建的快捷方式(注意32bit和 ...

  8. 使用Angularjs和Vue.js对比

    使用Angularjs和Vue.js对比 之前项目都是使用Angularjs,(注明此处主要讲Angularjs 1)在初步使用Vue.js后做一个简答的对比笔记. 首先从理论上简单说一下各自的特点, ...

  9. 关于echarts、layer.js和jqGrid的知识点

    使用echarts和layer.js直接去官方文档,能解决大部分问题. 但是有些问题,解释不够清楚,在这里记录一下. 1.echarts的使用 第一点:关于echarts的labelline在数据为零 ...

  10. C#的常见算法(面试)

    一.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+--+m //方法一,通过顺序规律写程序,同时也知道flag标志位的重要性. static int F1(int m) { ; ...