HDU 5009 Paint Pearls (动态规划)

Paint Pearls

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, he selects some continuous pearls and all these pearls will be painted to their target colors. When he paints a string which has k different target colors, Lee will cost k2 points.

Now, Lee wants to cost as few as possible to get his ideal string. You should tell him the minimal cost.

Input

There are multiple test cases. Please process till EOF.

For each test case, the first line contains an integer n(1 ≤ n ≤ 5×104), indicating the number of pearls. The second line contains a1,a2,...,an (1 ≤ ai ≤ 109) indicating the target color of each
pearl.

Output

For each test case, output the minimal cost in a line.

Sample Input

3
1 3 3
10
3 4 2 4 4 2 4 3 2 2

Sample Output

2
7

Source

2014 ACM/ICPC Asia Regional Xi‘an Online

Recommend

hujie

题目大意:

给定一系列的颜色,可以划分为任意多个任意大小的区间,每个区间的花费为 区间颜色数的平方,问你总花费最小是多少?

解题思路:

用动态规划,双向链表其实就是维护前面不同的元素,相同的元素删除。

我参照的是:http://blog.csdn.net/u011345136/article/details/39759935

解题代码:

#include <iostream>
#include <map>
#include <cstdio>
using namespace std;

const int maxn=51000;
int n,d[maxn],dp[maxn],pre[maxn],next[maxn];
map <int,int> mp;

//mp 记录数字对应的下标
//pre 记录前驱
//next 记录后继
void solve(){
    mp.clear();
    for(int i=1;i<=n;i++){
        pre[i]=i-1;
        next[i]=i+1;
        dp[i]=(1<<30);
    }
    dp[0]=0;pre[0]=-1;
    for(int i=1;i<=n;i++){
        if(mp.find(d[i])==mp.end()) mp[d[i]]=i;
        else{
            int id=mp[d[i]];
            next[pre[id]]=next[id];
            pre[next[id]]=pre[id];
            mp[d[i]]=i;
        }
        int c=0;
        for(int j=pre[i];j!=-1;j=pre[j]){
            c++;
            dp[i]=min(dp[i],dp[j]+c*c);
            if(c*c>=i) break;
        }
    }
    printf("%d\n",dp[n]);
}

int main(){
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++) scanf("%d",&d[i]);
        solve();
    }
    return 0;
}
时间: 2024-10-16 04:50:45

HDU 5009 Paint Pearls (动态规划)的相关文章

hdu 5009 Paint Pearls (动态规划)

Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2359    Accepted Submission(s): 761 Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color

HDU 5009 Paint Pearls _(:зゝ∠)_2014 ACM/ICPC Asia Regional Xi&#39;an Online

呵呵 #include <cstdio> #include <algorithm> #include <iostream> #include <cstring> typedef long long ll; using namespace std; const int N = 5 * 10000 + 5; int xval[N], dep; int n, a[N], pre[N]; ll d[N]; int pos[300], dd; void work()

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

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

HDU 5009 Paint Pearls(西安网络赛C题) dp+离散化+优化

转自:http://blog.csdn.net/accelerator_/article/details/39271751 吐血ac... 11668627 2014-09-16 22:15:24 Accepted 5009 1265MS 1980K 2290 B G++ czy   Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm

HDU 5009 Paint Pearls 双向链表优化DP

Paint Pearls 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 eac

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 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 - 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 5009 Paint Pearls

首先把具有相同颜色的点缩成一个点,即数据离散化. 然后使用dp[i]表示涂满前i个点的最小代价.对于第i+1个点,有两种情况: 1)自己单独涂,即dp[i+1] = dp[i] + 1 2)从第k个节点之后(不包括k)到第i+1个节点一次涂完,且一起涂的节点共有num种颜色,即dp[i+1] = dp[k] + num * num 从而可以得到状态转移方程dp[i+1] = min(dp[i], dp[k] + num * num) 但是如果从后往前遍历每一个k,会超时. 因此我们可以使用双向链