【bzoj4897】[Thu Summer Camp2016成绩单]

【bzoj4897】[Thu Summer Camp2016成绩单]

区间DP神题
Orz GXZ
看了GXZ大神的博客然后懂了.
考虑如何把最大最小值压进状态里.
设\(f[l][r]\)表示\(l\)到\(j\)删除的最小代价.
\(g[l][r][i][j]\)表示序列\(l\)到\(r\)删至最大值为\(i\),最小值为\(j\)的最小代价
然后考虑转移\(g\)
考虑最后一位r.
转移有两种情况:
第一种:它在\([l,r]\)中被整体删除.那么这个时候就要更新最大最小值
\(g[l][r][max(i , w[r]][min(j , w[r])] = g[l][r - 1][i][j]\)
第二种:它在\([k,r]\)中作为子区间删除
\(g[l][r][i][j] = g[l][k][i][j] + f[k + 1][r]\)

考虑f数组的转移
\(f[l][r] = g[l][r][i][j] + a + b * (i - j)^2\)

由于\(w_i\)太大,可以考虑离散化

/*header*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#define rep(i , x, p) for(int i = x;i <= p;++ i)
#define sep(i , x, p) for(int i = x;i >= p;-- i)
#define gc getchar()
#define pc putchar
#define ll long long
#define mk make_pair
#define fi first
#define se second
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::lower_bound;
const int maxN = 50 + 7;

int f[maxN][maxN];
int g[maxN][maxN][maxN][maxN];
int w[maxN] , s[maxN];

inline int gi() {
    int x = 0,f = 1;char c = gc;
    while(c < '0' || c > '9') {if(c == '-')f = -1;c = gc;}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = gc;}return x * f;
}

void print(int x) {
    if(x < 0) pc('-') , x = -x;
    if(x >= 10) print(x / 10);
    pc(x % 10 + '0');
}

inline int sqr(int x) {
    return x * x;
}

inline void gmin(int &x , int y) {
    x > y ? x = y : 0;
}

int main() {
//  freopen("1.in","r",stdin);
    int n =  gi() , a = gi(), b = gi();
    rep(i , 1, n) s[i] = w[i] = gi();
    sort(s + 1,s + n + 1);
    memset(f,0x3f,sizeof(f));memset(g,0x3f,sizeof(g));
    rep(i , 1, n) w[i] = lower_bound(s + 1, s + n + 1, w[i]) - s , f[i][i] = a , g[i][i][w[i]][w[i]] = 0;
    rep(len , 2, n) {
        rep(l , 1, n) {
            int r = l + len - 1;g[l][r][w[r]][w[r]] = f[l][r - 1];
            if(r > n) break;
            rep(i , 1, n)
                rep(j , 1, i)
                    g[l][r][max(i , w[r])][min(j , w[r])] = min(g[l][r - 1][i][j] , g[l][r][max(i , w[r])][min(j , w[r])]) ;
            rep(k , l, r - 1)
                rep(i , 1, n)
                    rep(j , i, n)
                        gmin(g[l][r][j][i] , g[l][k][j][i] + f[k + 1][r]);
            rep(i , 1, n) {
                rep(j , i, n) {
                    f[l][r] = min(f[l][r] , g[l][r][j][i] + a + b * sqr(s[j] - s[i])) ;
                }
            }
      }
    }
    print(f[1][n]);
    return 0;
}

原文地址:https://www.cnblogs.com/gzygzy/p/10207196.html

时间: 2024-08-29 20:58:36

【bzoj4897】[Thu Summer Camp2016成绩单]的相关文章

BZOJ 4896 :[Thu Summer Camp2016]补退选 Trie树+Vector

4896: [Thu Summer Camp2016]补退选 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 315  Solved: 97[Submit][Status][Discuss] Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最忙碌.在补退选阶段,学生即可以选课,也 可以退课.对于

【BZOJ4896】[Thu Summer Camp2016]补退选 Trie树

[BZOJ4896][Thu Summer Camp2016]补退选 Description X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每 次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最忙碌.在补退选阶段,学生即可以选课,也 可以退课.对于X老师来说,在补退选阶段可能发生以下两种事件: 1:一个姓名为S的学生选了他的课(姓名S将出现在X的已选课学生名单中) 2:一个姓名为S的学生退了他的课(姓名S将从X的已

BZOJ4896 [Thu Summer Camp2016]补退选

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ4896 正解:$Trie+vector$ 解题报告: $THUSC2016$ $T2$ 考虑每次加入删除对出现次数的影响只会加减一,那么我可以先用$Trie$来维护整个问题中出现的字符串,然后对于每个节点我都记录一下以当前串为前缀的字符

【THUSC2016】成绩单(bzoj4897)

$f(i,j,x,y)$ 表示区间 $[i,j]$中,第 $j$ 个数在最后一次操作中才消去,最后一次操作的最大值为 $x$,最小值为 $y$ 时的最小代价: $g(i,j)$ 表示区间 $[i,j]$ 中,不管第 $j$ 个数是在之前哪次消的情况下,消掉区间所有数的总代价. 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/bzoj4897.html

thu 2016 成绩单

期末考试结束了,班主任 L 老师要将成绩单分发到每位同学手中.L老师共有 nn 份成绩单,按照编号从 11 到 nn 的顺序叠放在桌子上,其中编号为 ii的成绩单分数为 W_iWi?. 成绩单是按照批次发放的.发放成绩单时,L 老师会从当前的一叠成绩单中抽取连续的一段,让这些同学来领取自己的成绩单.当这批同学领取完毕后,L 老师再从剩余的成绩单中抽取连续的一段,供下一批同学领取.经过若干批次的领取后,成绩单将被全部发放到同学手中. 然而,分发成绩单是一件令人头痛的事情,一方面要照顾同学们的心理情

html 成绩单表格

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body> <table border="1" style="border-collapse: collapse" align="cente

[Thu Summer Camp 2015]解密运算

4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串. 比如对于字符串“ABCAAA”,我们可以得到这N+1个串: ABCAAA. BCAAA.A CAAA.AB AAA.ABC AA.ABCA A

模拟登录学校教务管理系统,获取成绩单!

界面如下: 这个模拟是高仿真学校教务系统的,好处就是,可以快速登陆系统直接获取成绩. 避开了繁琐的查询步骤,和节约了查询的时间,极大的提高了用户的体验. 核心源代码如下: <?php //屏蔽notice信息 error_reporting(E_ALL ^ E_NOTICE); //设置文本头信息 header("Content-Type:text/html;charset=utf-8"); if ( $_REQUEST['xh'] && $_REQUEST['p

SAP 2016上半年成绩单曝光: 大中华区成全球重要驱动引擎(转载)

2016-07-22 17:44:54 来源: 华夏时报(北京) (原标题:SAP2016上半年成绩单曝光: 大中华区成全球重要驱动引擎) 本报记者 卢晓 北京报道 "尽管有大量媒体的报道说中国的经济在放缓,但不管采用任何一个国际标准,中国经济的增长在全球表现还是非常优异的."7月21日,SAP大中华区总裁纪秉盟对<华夏时报>记者说. 7月21日当天,SAP大中华区对外发布了自己的2016年半年业绩.据记者了解,SAP大中华区的软件及软件相关服务收入实现两位数增长.而其云业