HDU 5009 (dp+双向链表优化)

西安网络预赛题。

连续选区间填充,完全覆盖。

dp[i] 完全覆盖的最优解。

连续一起的同种颜色缩并。

优化:

1. 至多每个单独选,价值最高为N

2.不能连续选择超过sqrt(N)+1个不同的颜色

3.第i种颜色来的时候,它之前本身的颜色不再考虑。

PS:此题本来打算离散化数据,但是用map就不用了(直接判重)。对于有序的数据,离散化还要再映射

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define MAXN (50000+5)
using namespace std;
int a[MAXN],b[MAXN],pre[MAXN],nxt[MAXN];
int dp[MAXN];
int main()
{
    int N,M;pre[0]=-1;map<int,int> color;
    while(~scanf("%d",&N)){
        for(int i=1;i<=N;i++)
            scanf("%d",a+i),pre[i]=i-1,nxt[i]=i+1;
        M=1;b[1]=a[1];
        for(int i=2;i<=N;i++)
            if(a[i]!=a[i-1])
                b[++M]=a[i];
        dp[0]=0;color.clear();
        for(int i=1;i<=M;i++){
            if(color[b[i]]==0) color[b[i]]=i;//map判重
            else{
                int k=color[b[i]];
                nxt[pre[k]]=nxt[k];
                pre[nxt[k]]=pre[k];
                color[b[i]]=i;
            }
            dp[i]=i;
            for(int j=i-1,k=1;j!=-1;j=pre[j],k++){
                if(k>(int)sqrt(M)+1) break;
                int tmp=dp[j]+k*k;
                if(tmp>M)break;
                dp[i]=min(dp[i],tmp);
            }
        }
        printf("%d\n",dp[M]);
    }
}
时间: 2024-10-11 22:54:54

HDU 5009 (dp+双向链表优化)的相关文章

HDU - 5009 Paint Pearls(dp+双向链表优化)

Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans to color the pearls to make it more fascinating. He drew his ideal pattern of the string on a paper and asks for your help. In each operation,

hdu 3507(DP+斜率优化)

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 6653    Accepted Submission(s): 2054 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique

HDU 5009 DP

2014 ACM/ICPC Asia Regional Xi'an Online 对于N个数 n(1 ≤ n ≤ 5×104), 把N个数分成任意个区间,每个区间的值是该区间内不同数字个数的平方和,答案使和最小 DP思路,首先要对数据合并相连相同数字,然后离散化. 数据太弱了..... 然后直接做N*N的DP竟然能AC....比赛时候想到了...不敢写... G++AC C++TLE #include "stdio.h" #include "string.h" #i

HDU 3480 DP 斜率优化 Division

把n个数分成m段,每段的值为(MAX - MIN)2,求所能划分得到的最小值. 依然是先从小到大排个序,定义状态d(j, i)表示把前i个数划分成j段,所得到的最小值,则有状态转移方程: d(j, i) = min { d(j-1, k) + (ai - ak+1)2 | 0 ≤ k < i } 设 l < k < i,且由k转移得到的状态比由l转移得到的状态更优. 有不等式: 整理成斜率形式: 后面的就可以相当于套模板了,不过这里要用滚动数组优化一下空间. 1 #include <

HDU 3045 DP 斜率优化 Picnic Cows

题意:将n个数分成若干组,每组数字的个数不少于t个,要把每组的数字减小到这组最小值,求所有数字减少的最小值. 先将这n个数从小到大排个序,可以想到一组里面的数一定是排序后相邻的. 设d(i)表示前i个数分完组以后减少的最小值,考虑j~i为一组,则有状态转移方程 还是一样的处理方法,设k < j ≤ i - t,且j~i为一组的值比k~i为一组的值更优. 则有不等式: 化简,把i分离出来,整理成斜率的形式: 写到这里就应该很清楚地能够看出来X和Y的表达式了. 1 #include <iostre

HDU - 5009 Paint Pearls(dp+优化双向链表)

Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans to color the pearls to make it more fascinating. He drew his ideal pattern of the string on a paper and asks for your help. In each operation,

Print Article hdu 3507 一道斜率优化DP 表示是基础题,但对我来说很难

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 4990    Accepted Submission(s): 1509 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique

HDU 5009 Paint Pearls(西安网络赛C题)

HDU 5009 Paint Pearls 题目链接 题意:给定一个目标颜色,每次能选一个区间染色,染色的代价为这个区间不同颜色数的平方,问最小代价 思路:先预处理,把相同颜色的一段合并成一个点,然后把颜色离散化掉,然后进行dp,dp[i]表示染到第i个位置的代价,然后往后转移,转移的过程记录下不同个数,这样就可以转移了,注意加个剪枝,就是如果答案大于了dp[n]就不用往后继续转移了 代码: #include <cstdio> #include <cstring> #include

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.