题目大意:现有$n$条排成一行的木板,每个木板有一个目标颜色。你每次能将一个区间内的木板分别染成它们的目标颜色,而这次染色的代价为这个区间内不同目标颜色的木板的数量的平方。问将全部木板染成目标颜色的最小代价。

数据范围:$n≤50000$,颜色数量$≤50000$。

这题我们显然可以$dp$,令$f[i]$表示把前i个点覆盖完的最小代价,显然$f[i]=min(f[j-1]+w(j,i)^2)$ 其中$w(j,i)$表示区间$[i,j]$中的颜色数量。

这一题有一个隐藏条件,就是总代价不会超过$n$,这个是显然的。

所以,当区间$[i,j]$中的颜色数量$>\sqrt{n}$时,就显然不是最优的。

考虑到$f[i]$是非降的,那么我们处理一个数组$pre[i][j]$表示:从第$i$号点开始,恰好包含$j$种颜色的区间最左侧的端点编号。

我们从$1$到$\sqrt{n}$枚举$j$,每次$O(n)$的时间从右往左扫,详情见代码。

然后就愉悦地做完了,时间复杂度为$O(n*\sqrt{n})$。

 #include<bits/stdc++.h>
#define M 100005
#define INF 1000000005
using namespace std; int n,a[M]={},pre[M][]={},f[M]={},cnt[M]={},sum=; int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",a+i);
for(int j=;j*j<=n;j++){
for(int i=n,k=n;~i;i--){
while(k>=&&sum<=j){
cnt[a[k]]++;
if(cnt[a[k]]==) sum++;
k--;
}
pre[i][j]=k+;
cnt[a[i]]--; if(!cnt[a[i]]) sum--;
}
}
for(int i=;i<=n;i++){
f[i]=INF;
for(int j=;j*j<=n;j++)
f[i]=min(f[i],f[pre[i][j]]+j*j);
}
printf("%d\n",f[n]);
}

【xsy1172】 染色 dp的更多相关文章

  1. Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)

    #include<bits/stdc++.h>using namespace std;const long long mod=998244353;long long f[200007][2 ...

  2. 【POJ 1112】Team Them Up!(二分图染色+DP)

    Description Your task is to divide a number of persons into two teams, in such a way, that: everyone ...

  3. poj-1112 (二分图染色+dp分组)

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; ; ...

  4. BZOJ:2958 序列染色 DP

    bzoj2958 序列染色 题目传送门 Description 给出一个长度为N由B.W.X三种字符组成的字符串S,你需要把每一个X染成B或W中的一个. 对于给出的K,问有多少种染色方式使得存在整数a ...

  5. 染色dp(确定一行就可行)

    题:https://codeforces.com/contest/1027/problem/E 题意:给定n*n的方格,可以染黑白,要求相邻俩行”完全“不同或完全相同,对于列也是一样.然后限制不能拥有 ...

  6. 5.29 省选模拟赛 树的染色 dp 最优性优化

    LINK:树的染色 考场上以为这道题要爆蛋了 没想到 推出正解来了. 反正是先写了爆搜的 爆搜最近越写越熟练了 容易想到dp 容易设出状态 f[i][j]表示以i为根的子树内白色的值为j此时黑色的值怎 ...

  7. bzoj2958: 序列染色(DP)

    2958: 序列染色 题目:传送门 题解: 大难题啊(还是我太菜了) %一发大佬QTT 代码: #include<cstdio> #include<cstring> #incl ...

  8. Atcoder Grand Contest 031B(DP,思维)

    #include<bits/stdc++.h>using namespace std;int a[200007];int b[200007];long long dp[200007];lo ...

  9. [学习笔记]整体DP

    问题: 有一些问题,通常见于二维的DP,另一维记录当前x的信息,但是这一维过大无法开下,O(nm)也无法通过. 但是如果发现,对于x,在第二维的一些区间内,取值都是相同的,并且这样的区间是有限个,就可 ...

随机推荐

  1. android 网站上下的 adt 不能显示没有安装的

    问题描述 使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository ...

  2. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  3. 2018.07.23 洛谷P4097 [HEOI2013]Segment(李超线段树)

    传送门 给出一个二维平面,给出若干根线段,求出x" role="presentation" style="position: relative;"&g ...

  4. 微信第三方平台解密报错:Illegal key size

    今天在交接别人代码的时候遇到的,微信第三方平台解密报的错误,原因: 如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size ...

  5. maven插件mybatis-generator生成代码

    第一步,在pom中加入插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId> ...

  6. 继承方法-->call继承

    function Person(name,age,sex){ this.name = name; this.age = age; this.sex = sex; }function P1(name,a ...

  7. I2C总线驱动框架详解

    一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,I2C通信方法(”algorithm”)上层的,与 ...

  8. faceswap使用手冊

    cd faceswap cd faceswap-master python faceswap.py gui Notice: This repository is not operated or mai ...

  9. 解决火狐浏览器发送jquery的ajax请求无效的问题

    今天遇到这样一个问题: 页面在chrome下发送ajax的请求是没有问题的,但是在firfox下无效. 代码大致如下: //前面省略 <form> ..... <button cla ...

  10. STL中的algorithm

    STL中的algorithm #include<algorithm>中的泛函算法,需要添加头文件. 搜索算法:find() .search() .count() .find_if() .s ...