这题说的是给了一个  长度为n(n<=50000)的数列,数列表示的是给每个珍珠涂的颜色,任务是将一窜长度为n的珍珠涂成他所要的颜色。然后你可以操至多n次, 每次画只能画连续的区间,每次操作是的代价是这个区间内不同颜色的个数,

可以知道最多的代价是区间的长度。 然后 可以知道当这个区间内不同颜色的个数大于如果大于sqrt(n)那还不如一个一个涂花费少,然后现在就剩下处理理当前位置j种颜色的达到的最远距离, 找到这个点对于之前出现相同的颜色的位置用per[i]记录, flow[i][j] 表示 距离i这个位置 有j中不同颜色的最远距离,可以从flow[i-1][j] 来 如果per[i]>i-1-flow[i-1][j] 那么可以知道这个点一定在flow[i-1][j] 内出现过 自然最远距离再加1, 如果不成立则他的最远距离就是 flow[i-1][j-1]+1,然后dp[i] 为前多少种颜色合并时花费的代价最小。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
const int maxn =*;
int A[maxn],B[maxn];
int F[maxn],per[maxn];
int flow[][maxn];
int dp[maxn];
int main()
{
int n;
while(scanf("%d",&n)==){
for(int i=; i<=n; i++){
scanf("%d",&A[i]);
B[i-]=A[i];
}
sort(B,B+n);
int len = unique( B, B+n )-B;
for(int i=; i<=n; i++){
A[i]= lower_bound(B,B+len,A[i])-B;
}
memset(F,-,sizeof(F));
int m=;
for(int i=; i<=n; ++i){
if(A[m-]!=A[i]){
A[m++]=A[i];
}
}
for(int i= ; i<m; ++i){
per[i]=F[A[i]];
F[A[i]]=i;
}
memset(flow,,sizeof(flow));
int now=;
int L =sqrt(m+1.0);
for(int i=; i<m; ++i){
dp[i]=i;
now=-now;
for(int j=; j<=L; ++j){
flow[now][j]=per[i]>i--flow[-now][j]?flow[-now][j]+:flow[-now][j-]+;
dp[i]=min(dp[i],j*j+dp[i-flow[now][j]]);
}
}
printf("%d\n",dp[m-]);
} return ;
}

hdu5009的更多相关文章

  1. HDU-5009 Paint Pearls 动态规划 双向链表

    题目链接:https://cn.vjudge.net/problem/HDU-5009 题意 给一串序列,可以任意分割多次序列,每次分割的代价是被分割区间中的数字种数. 求分割区间的最小代价.n< ...

  2. hdu5009 Paint Pearls (DP+模拟链表)

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 M ...

  3. hdu-5009 Paint Pearls DP+双向链表 with Map实现去重优化

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 题目要求对空序列染成目标颜色序列,对一段序列染色的成本是不同颜色数的平方. 这题我们显然会首先想到用DP去 ...

  4. hdu5009 Paint Pearls[指针优化dp]

    Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  5. 2014 ACM/ICPC Asia Regional Xi'an Online

    03 hdu5009 状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数. 普通的O(n*n)是会超时的,可以想到o[]最大为 ...

  6. qbxt Day3 其余题

    例题1 noiopenjudge9277 给出在最底层的木头的个数,问有多少种堆放木头的方式,当然你的堆放方式不能让木头掉下来. 在堆放的时候木头必须互相挨着在一起. 设dp[i]表示多少个log(原 ...

  7. [总结-动态规划]经典DP状态设定和转移方程

    马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...

随机推荐

  1. OAuth2认证有一定的了解

    转到分享界面后,进行OAuth2认证: 以新浪为例: 第一步.WebView加载界面,传递参数 使用WebView加载登陆网页,通过Get方法传递三个参数:应用的appkey.回调地址和展示方式dis ...

  2. 解决报错:scandir() has been disabled for security reasons

    服务器环境: LNMP 在服务器部署代码时候.遇到了这个问题. 蛋疼啊! 2 解决办法:  打开phpinfo.php , 搜索: scandir 找到disabled_function,确认此函数未 ...

  3. Dockerfile分享之SSH Server

    版权声明:本文由姚俊刚原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/84 来源:腾云阁 https://www.qclou ...

  4. 12.文件系统fs

    文件系统fs ==> 提供文件的读取, 写入, 更名, 删除, 遍历目录, 链接等POSIX文件系统操作 1.fs.readFile(filename, [encoding], [callbac ...

  5. 1.node.js下载

    1.下载node.js http://nodejs.cn/ 2.下载git https://git-scm.com/download/win 3.安装npm npm install npm -g 使用 ...

  6. 网页头部的声明应该是用 lang="";

    我们经常需要用缩写的代码来表示一种语言,比如用en表示英语,用de表示德语.ISO 639就是规定语种代码的国际标准.最早的时候,ISO 639规定的代码是,用两个拉丁字母表示一种语言,这被称为ISO ...

  7. 二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

    将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: typedef struct TreeNode{ int data; struct TreeNode *le ...

  8. oracle日常函数汇总(转载)

    第一篇 著名函数之单值函数 注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式 数值类型函数 数值型函数输入数字型参数并返回数值型的值.多数该类函数的返回值支持38 ...

  9. MVC之LayOut布局页

    LayOut布局页,就是相当于WebForm中母版页,实现了一个代码的共用和公共布局的作用. 布局页的使用 (1)添加新项,选择MVC布局页 <!DOCTYPE html> <htm ...

  10. pymysql executemany

    Cursor Objects — PyMySQL 0.7.2 documentation https://pymysql.readthedocs.io/en/latest/modules/cursor ...