zoukankan      html  css  js  c++  java
  • hdu5009

    这题说的是给了一个  长度为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 =10005*5;
    int A[maxn],B[maxn];
    int F[maxn],per[maxn];
    int flow[2][maxn];
    int dp[maxn];
    int main()
    {
         int n;
         while(scanf("%d",&n)==1){
             for(int i=1; i<=n; i++){
                   scanf("%d",&A[i]);
                   B[i-1]=A[i];
             }
             sort(B,B+n);
             int len = unique( B, B+n )-B;
             for(int i=1; i<=n; i++){
                 A[i]= lower_bound(B,B+len,A[i])-B;
             }
             memset(F,-1,sizeof(F));
             int m=2;
             for(int i=2; i<=n; ++i){
                 if(A[m-1]!=A[i]){
                     A[m++]=A[i];
                 }
             }
             for(int i=1 ; i<m; ++i){
                  per[i]=F[A[i]];
                  F[A[i]]=i;
             }
             memset(flow,0,sizeof(flow));
             int now=0;
             int L =sqrt(m+1.0);
             for(int i=1; i<m; ++i){
                    dp[i]=i;
                now=1-now;
                for(int j=1; j<=L; ++j){
                 flow[now][j]=per[i]>i-1-flow[1-now][j]?flow[1-now][j]+1:flow[1-now][j-1]+1;
                 dp[i]=min(dp[i],j*j+dp[i-flow[now][j]]);
                }
             }
             printf("%d
    ",dp[m-1]);
         }
    
        return 0;
    }
    View Code
  • 相关阅读:
    linux删除目录的命令
    Windows XP下git通过代理下载android代码
    白话算法希尔排序
    操作系统——存储技术
    如何理解Linus Torvalds的“什么才是优秀程序员”的话
    程序员自我修养读书随笔——目标文件
    面试求职:大数据处理总结
    持久化与Session定义
    java中byte转换int时为何与0xff进行与运算
    OSI七层相关协议
  • 原文地址:https://www.cnblogs.com/Opaser/p/3974753.html
Copyright © 2011-2022 走看看