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"
#include "queue"
#include "iostream"
#include "algorithm"
using namespace std;

const int inf = 0x3f3f3f3f;

struct node
{
    int x,id,v;
}a[50000];
int dp[50010],vis[50010];
vector<int>q;
bool cmpx(node a,node b)
{
    return a.x<b.x;
}

bool cmpid(node a,node b)
{
    return a.id<b.id;
}

int Min(int a,int b)
{
    if (a<b) return a;
    else return b;
}

int main()
{
    int n,m,i,j,temp,x,cnt;
    while (scanf("%d",&n)!=EOF)
    {
        m=1;
        scanf("%d",&a[1].x);
        a[1].id=1;
        for (i=2;i<=n;i++)
        {
            scanf("%d",&x);
            if (x!=a[m].x)
            {
                a[++m].x=x;
                a[m].id=m;
            }
        } // 合并相邻相同数字
        n=m;
        sort(a+1,a+1+n,cmpx);
        temp=1;
        a[1].v=1;
        for (i=2;i<=n;i++)
        {
            if (a[i].x!=a[i-1].x) temp++;
            a[i].v=temp;
        } // 离散化

        sort(a+1,a+1+n,cmpid);

        memset(dp,inf,sizeof(dp));
        dp[0]=0;
        dp[n]=n;
        memset(vis,0,sizeof(vis));
        for (i=0;i<n;i++)
        {
            if (dp[i]>dp[i+1]) continue;
            cnt=0;
            for (j=i+1;j<=n;j++)
            {
                if (vis[a[j].v]==0)
                {
                    cnt++;
                    q.push_back(a[j].v);
                    vis[a[j].v]=1;
                }
                if (dp[i]+cnt*cnt>=dp[n]) break; // 小优化,大于DP[n] 直接退出
                dp[j]=Min(dp[j],dp[i]+cnt*cnt);
            }
            for (j=0;j<q.size();j++)
                vis[q[j]]=0;
            q.clear();
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}
时间: 2024-08-01 19:41:01

HDU 5009 DP的相关文章

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

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

HDU 4832(DP+计数问题)

HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long ll; const ll MOD = 9999991; const int N = 1005; int t, n, m, k, x, y; ll dp1

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 3944 dp?

DP? Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 128000/128000 K (Java/Others)Total Submission(s): 1804    Accepted Submission(s): 595 Problem Description Figure 1 shows the Yang Hui Triangle. We number the row from top to bottom 0,1,2,-a

hdu 5389 dp类似背包

http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter of this

hdu 1025 dp 最长上升子序列

1 //Accepted 4372 KB 140 ms 2 //dp 最长上升子序列 nlogn 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 500005; 8 int dp[imax_n]; 9 int d[imax_n]; 10 int a[imax_n]; 11 int n; 12 int len

HDU 5928 DP 凸包graham

给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也就是 dp[j][k]代表当前链末端为j,其内部点包括边界数量为k的最小长度.这样最后得到的一定是最优的凸包. 然后就是要注意要dp[j][k]的值不能超过L,每跑一次凸包,求个最大的点数量就好了. 和DP结合的计算几何题,主要考虑DP怎么搞 /** @Date : 2017-09-27 17:27

HDU 4901 DP背包

给你n个数,问你将数分成两个数组,S,T ,T 中所有元素的需要都比S任意一个大,问你S中所有元素进行 XOR 操作和 T 中所有元素进行 &操作值相等的情况有多少种. DP背包思路 dpa[i][j][0]  表示从左开始到i,不取i,状态为j的方案数 dpa[i][j][1]  表示从作开始到i,取i,状态为j的方案数 dpb[i][j]      表示从右开始到i,状态为j的方案数 因为S集合一定在T集合的左边,那么可以枚举集合的分割线,并且枚举出的方案要保证没有重复,如果要保证不重复,只

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