loj2292 「THUSC 2016」成绩单
我是傻逼,我啥也不会,这是我抄的。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, a, b, w[55], tot, dy[1005], g[55][55], f[55][55][55][55], va[55];
bool isAll(int i, int j, int l, int r){
for(int k=i; k<=j; k++)
if(w[k]<l || w[k]>r)
return false;
return true;
}
bool isAny(int i, int j, int l, int r){
for(int k=i; k<=j; k++)
if(w[k]>=l && w[k]<=r)
return true;
return false;
}
int F(int, int, int, int);
int G(int, int);
int F(int i, int j, int l, int r){
int &re=f[i][j][l][r];
if(re!=-1) return re;
re = 0x3f3f3f3f;
if(isAll(i, j, l, r)){
re = 0;
return 0;
}
if(!isAny(i, j, l, r)){
re = G(i, j);
return re;
}
for(int k=i; k<j; k++){
re = min(re, F(i,k,l,r)+F(k+1,j,l,r));
re = min(re, G(i,k)+F(k+1,j,l,r));
}
return re;
}
int G(int l, int r){
int &re=g[l][r];
if(re!=-1) return re;
re = 0x3f3f3f3f;
for(int i=1; i<=tot; i++)
for(int j=i; j<=tot; j++)
if(isAny(l, r, i, j)){
int u=va[j], v=va[i];
re = min(re, F(l, r, i, j) + a + b * (v - u) * (v - u));
}
return re;
}
int main(){
cin>>n>>a>>b;
for(int i=1; i<=n; i++){
scanf("%d", &w[i]);
dy[w[i]] = 1;
}
for(int i=1; i<=1000; i++)
if(dy[i]){
va[++tot] = i;
dy[i] = tot;
}
for(int i=1; i<=n; i++)
w[i] = dy[w[i]];
memset(f, -1, sizeof(f));
memset(g, -1, sizeof(g));
cout<<G(1, n)<<endl;
return 0;
}
loj2292 「THUSC 2016」成绩单的更多相关文章
- 【LOJ】#2292. 「THUSC 2016」成绩单
题解 神仙dp啊><(也有可能是我菜) 我们发现,想要拿一段区间的话,只和这个区间的最大值和最小值有关系,那么我们考虑,如果一个区间[l,r]我们拿走了一些数后,使它的最小值是a,最大值是 ...
- 「THUSC 2016」成绩单 & 方块消除 (区间dp)
成绩单 $f[l][r][mi][mx]$表示从l到r发到还没发的部分的最小值为mi最大值为mx时的最小代价. $f[l][r][0][0]$表示从l到r全部发完的代价. 自己写的无脑dp,枚举中转点 ...
- LOJ 2292 「THUSC 2016」成绩单——区间DP
题目:https://loj.ac/problem/2292 直接 DP 很难做,主要是有那种 “一个区间内部有很多个别的区间” 的情况. 自己想了一番枚举 max-min 的最大限制,然后在该基础上 ...
- 2018.10.27 loj#2292. 「THUSC 2016」成绩单(区间dp)
传送门 g[i][j][k][l]g[i][j][k][l]g[i][j][k][l]表示将区间l,rl,rl,r变成最小值等于kkk,最大值等于lll时的花费的最优值. f[i][j]f[i][j] ...
- loj 2292「THUSC 2016」成绩单
loj 看着就很区间dp,所以考虑求\(f_{i,j}\)表示区间\([i,j]\)的答案.注意到贡献答案的方式是每次选一个连续段,拿走后剩下的段拼起来继续段,所以转移就考虑从最后一次选的方法转移过来 ...
- 【LOJ】#2291. 「THUSC 2016」补退选
题解 在trie树上开vector记录一下这个前缀出现次数第一次达到某个值的下标,以及记录一下现在这个前缀有多少个 为什么thusc有那么水的题--是为了防我这种cai ji爆零么= = 代码 #in ...
- loj2291 「THUSC 2016」补退选
ref pkusc 快到了,做点 thusc 的题涨涨 rp-- #include <iostream> #include <cstring> #include <cst ...
- LOJ 2991 「THUSC 2016」补退选——trie+线段树合并或vector
题目:https://loj.ac/problem/2291 想了线段树合并的做法.就是用线段树维护 trie 的每个点在各种时间的操作. 然后线段树合并一番,线段树维护前缀最大值,就是维护最大子段和 ...
- LOJ#2799. 「CCC 2016」生命之环
题意 给你一个 \(n\) 个 \(\rm 01\) 组成的环,每次操作之后每个位置为1当且仅当他的左右恰好有1个1.输出进行 \(T\) 次操作之后的环. \(n\leq 10^5, T\leq 1 ...
随机推荐
- python基础之循环语句
一.if条件语句: 语法: 1.if单分支(单重条件判断) if expression: expr_true_suite 注释:expession为真执行代码expr_true_suite if单分支 ...
- Garmin APP开发之入门
Garmin开发-入门 先附上几个已经开发完成的app日历 up down 翻月 start 回到当前月(就差农历了) 秒表和定时器一体app界面比较简单,但是实用,长按菜单键可以切换秒表和定时器,有 ...
- alias 新的命令='原命令 -选项/参数'。举例说明,alias l=‘ls -lsh' 将重新定义 ls 命令,现在只需输入 l 就可以列目录了。
alias 新的命令='原命令 -选项/参数'.举例说明,alias l=‘ls -lsh' 将重新定义 ls 命令,现在只需输入 l 就可以列目录了.
- 使用NIO快速复制Java文件
package com.test.test; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputS ...
- hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)
题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...
- C#,什么是Attribute?什么特性?怎么被调用?
定制特性attribute,本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息(获取到特性类),相当于优雅的为元素添加了一个tag,这个tag是一个类. Attribu ...
- Coursera_Learn how to learn笔记
番茄工作法,隔20分钟休息一次. 构建组块步骤:1.集中注意力. 2.理解基本概念. 3.进行练习. 获得专业知识的第一步是创建概念组块,能够将分散的信息集合到一起. Recall(回顾)比反复阅读更 ...
- 传入指定字段名称就可以排序的EF写法
private static IQueryable<T> SetQueryableOrder<T>(this IQueryable<T> query, string ...
- geoNear查询 near查询的升级版
geoNear查询可以看作是near查询点进化版 geoNear查询使用runCommand命令进行使用,常用使用如下: db.runCommand({ geoNear:<collection& ...
- Java环境变量搭建(Linux环境)
1. 下载解压JDK压缩包 例如:解压到 /opt/jdk1.7.0_80 下 2. 添加环境变量到 /etc/profile 文件中 vi /etc/profile 在文件末尾追加如下内容: exp ...