LOJ 2292 「THUSC 2016」成绩单——区间DP
时间:2019-04-19
本文章向大家介绍LOJ 2292 「THUSC 2016」成绩单——区间DP,主要包括LOJ 2292 「THUSC 2016」成绩单——区间DP使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:https://loj.ac/problem/2292
直接 DP 很难做,主要是有那种 “一个区间内部有很多个别的区间” 的情况。
自己想了一番枚举 max-min 的最大限制,然后在该基础上最小化区间个数之类的。还是不会。
看了题解才会。
考虑再设一个 dp 数组来辅助表示那种麻烦的情况。
值可以离散化!又因为代价与值有关,可以考虑把值放进角标里。
令 f[ i ][ j ] 表示把 [ i , j ] 全取完的最小代价,g[ i ][ j ][ l ][ r ] 表示把 [ i , j ] 取得只剩下值在 [ l , r ] 之间的最小代价。
g[ i ][ j ][ l ][ r ] 转移时讨论一下 j 是否留下。若留下,则从 g[ i ][ j-1 ][ l ][ r ] 转移,否则枚举和 j 一起删掉的区间,从 g[ i ][ k-1 ][ l ][ r ] + f[ k ][ j ] 转移。
然后 f[ i ][ j ] 就是各种 g[ i ][ j ][ l ][ r ] 再加上把值在 [ l , r ] 的数一次取完的代价。
这种设状态为 “做到剩下特定元素” 的思想很好。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int Mx(int a,int b){return a>b?a:b;} int Mn(int a,int b){return a<b?a:b;} const int N=55,INF=1005; int n,m,A,B,a[N],tp[N],f[N][N],g[N][N][N][N]; int Sqr(int x){return x*x;} void cz(int &u,int v){if(v<u)u=v;} int main() { scanf("%d%d%d",&n,&A,&B); for(int i=1;i<=n;i++)scanf("%d",&a[i]),tp[i]=a[i]; sort(tp+1,tp+n+1); m=unique(tp+1,tp+n+1)-tp-1; for(int i=1;i<=n;i++)a[i]=lower_bound(tp+1,tp+m+1,a[i])-tp; memset(g,0x3f,sizeof g); for(int i=1;i<=n;i++) { f[i][i]=A; for(int l=1;l<=m;l++) for(int r=l;r<=m;r++) { if(a[i]>=l&&a[i]<=r)g[i][i][l][r]=0; else g[i][i][l][r]=A; } } for(int d=1;d<n;d++) for(int i=1;i+d<=n;i++) { int j=i+d; int mx=0,mn=INF; for(int k=i;k<=j;k++) mx=Mx(mx,a[k]),mn=Mn(mn,a[k]); f[i][j]=A+B*Sqr(tp[mx]-tp[mn]); for(int l=1;l<=m;l++) for(int r=l;r<=m;r++) { if(a[j]>=l&&a[j]<=r) cz(g[i][j][l][r],g[i][j-1][l][r]); for(int k=i+1;k<=j;k++) cz(g[i][j][l][r],g[i][k-1][l][r]+f[k][j]); cz(f[i][j],g[i][j][l][r]+A+B*Sqr(tp[r]-tp[l])); } } printf("%d\n",f[1][n]); return 0; }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php微信公众号开发之微信企业付款给个人
- tp5框架的增删改查操作示例
- PHP使用函数用法详解
- 微信企业转账之入口类分装php代码
- 多个Laravel项目怎么共用migrations详解
- layui数据表格自定义每页条数limit设置
- Laravel 集成微信用户登录和绑定的实现
- PHP实现微信对账单处理
- Laravel5.1框架路由分组用法实例分析
- PHP的HTTP客户端Guzzle简单使用方法分析
- laravel 框架实现无限级分类的方法示例
- 详解Laravel5.6通过路由进行API版本控制的简单方法
- php+layui数据表格实现数据分页渲染代码
- thinkPHP框架乐观锁和悲观锁实例分析
- PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解