【Coder Force】264C - Choosing Balls (DP高难度思维转换)

卡了2天,说多了都是泪。

/*
该点的最大值的可以由前面某个点加上相应的值得到。
而前面的点可以分析为以下的条件
1、前面的这个点与该点颜色相同。
2、这个点与这个点颜色不同。
3、前面没有点。
现在分析:
由于1、3两个条件已经是o(1)的时间,所以不需要优化。
主要的时间出在于2的时间,2需要遍历。
假设2里面有n个条件需要判断,其实归结起来,我们只需要判断两个情况
1、这个点的颜色与该点相同
2、这个点的颜色与该点不同。
而且假如不同的话,加上的差值都是一样的,所以我们应该选择一个积累了最大的与该点颜色不同的点加上该差值,那么这个点的值就是达到最大。
这个是由于a,b两个量决定的,所以我们应该在该点当中选择一个最大的即可。
所以优化的方法便是保留两个值,一个是最大,一个是最小。这样就能够保证取到一种颜色不同的最大值
假如保留一个的话可能会有一种情况,即该点的颜色与最大的颜色相同,这样的话便少考虑了一种情况,显然这是不可行的。
dp[i]表示的是i颜色迄今为止所能够达到的最大的值
关于dp的状态量表示的想法:dp[i],对于i的选取一般都选择位置,
但是对于数据量大的时候,我们不妨考虑已知的其他量,然后去推相应的状态方程,假如不行的话,再想相应的优化方法,不失为一个好的决策。
在考虑一点如何转换的时候,不妨考虑该点的转换方向
*/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long dp[100005];
int c[100005];
long long v[100005];
int id1, id2;
const long long inf = 0x7ffffffffffffff;
int main()
{
    int n, m;
    while (cin >> n >> m)
    {
        for (int i = 1; i <= n; i++)
            cin >> v[i];
        for (int i = 1; i <= n; i++)
            scanf("%d", &c[i]);
        long long a, b;
        for (int i = 0; i < m; i++)
        {
            long long sum=0, ans;
            cin >> a >> b;
            id1 = 0;
            id2 = 0;
            for (int j = 0; j <= n; j++)
                dp[j] = -inf;
            for (int j = 1; j <= n; j++)
            {
                int cc = c[j];
                ans = max(dp[cc]+a*v[j],b*v[j]);
                if (cc != id1)
                    ans = max(ans, dp[id1] + b*v[j]);
                else
                    ans = max(ans, dp[id2] + b*v[j]);
                if (ans > dp[id1])
                {
                    if (id1 != cc)
                    {
                        id2 = id1;
                        id1 = cc;
                    }
                    else
                        id1 = cc;
                }
                else
                if (ans > dp[id2] && cc != id1)
                    id2 = cc;
                dp[cc] = max(dp[cc],ans);
                sum = max(ans, sum);

            }
            cout << sum << endl;
        }
    }
}
时间: 2024-10-08 02:15:40

【Coder Force】264C - Choosing Balls (DP高难度思维转换)的相关文章

CodeForces 264C Choosing Balls dp(水

题目链接: 题意: 给定n q 表示有n个石头 q个询问 下面n个数字给出每个石头的价值 下面n个数字给出每个石头的颜色(用1-n表示) 选出一个子序列使得序列的权值和最大(序列权值计算方式:当这个点的颜色和前面那个点颜色相同时 贡献 value * a, otherwise 贡献 value * b) 下面q行,每行给出 a 和 b的值. 思路: 首先求dp方程 dp[i]表示颜色为i时的最大值 那么 this_point_value = max(dp[j] + b*v[i]) (i!=j)

Codeforces Round #162 (Div. 1) C Choosing Balls dp

//dp[i] 表示以颜色为i结尾的最大值 //dp[i] = max(dp[i] , dp[i] + a*v[i] ,other_max + b*v[i]) ; //为除颜色i以外的其它颜色的最大值 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 100010 ; const __int64 inf = 0x7fffffffffff

使用Aspose.Cell控件实现Excel高难度报表的生成(三)

在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下: 使用Aspose.Cell控件实现Excel高难度报表的生成(一) 使用Aspose.Cell控件实现Excel高难度报表的生成(二) 使用Aspose.Cell控件实现多个Excel文件的合并 这几篇文章,都对Apose.Cell这个控件生成各种Excel的方式进行了阐述,对直接把DataTable或者IList生成Excel的操作,对通过模板方式实现自定义报表的各种方式,以及多个文件的合并的

hdu 4870 Rating(概率DP&amp;高数消元)

Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 714    Accepted Submission(s): 452 Special Judge Problem Description A little girl loves programming competition very much. Recently, she

【日常学习】【区间DP+高精】codevs1166 矩阵取数游戏题解

题目来自NOIP2007TG3 如果在考场上我现在已经歇菜了吧 今天一整天的时间全部投在这道题上,收获不小. 先上题目 题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. 每次取走的各个元素只能是该元素所在行的行首或行尾: 3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素

《高难度谈话》读书摘录

1.停止争论谁对谁错:了解他人的故事 面对分歧,如果从宽容的角度出发,你可能会想,“嗨,每个人都有自己的想法”或“凡事都有两面性”. 要想让争辩双方达成某种共识,首先需要学会换位思考,在充分了解对方具体情况的基础上,弄明白其结论产生的原因和意义,与此同时,我们还需要帮助对方了解我们,明白我们的结论来自何方,有何意义.从本质来说,了解并理解对方并不一定就能“解决”问题,但这是双方为解决问题而共同迈出的第一步. 有原则且按照这些原则去做原本并没有错.事实上,我们很需要它们来规范自己的生活.可是,当你

hdu 3709 数位dp(小思维)

http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit.

POJ 1202 Family 概率,DP,高精 难度:2

http://poj.org/problem?id=1202 难度集中在输出格式上,因为输出格式所以是高精度 递推式: 血缘肯定只有从双亲传到儿子的,所以,设f,m为双亲,son为儿子,p[i][j]为i和j之间的血缘关系,p[j][i]=p[i][j] 则: p[son][f]=p[son][m]=0.5+0.5*p[f][m] 对于兄弟和其他不是双亲的节点j,则有 p[son][j]=0.5*(p[f][j]+p[m][j]) 另外:http://swerc.up.pt/2002/Data/

【Coder Force】#360B - Levko and Array(DP 二分枚举)

题目大题:CF上的题目还是比较容易读懂的.这道题的意思嘛,他是说,有一个不超过2000个数的数组,每一个数与后面的数的绝对值称为value,那么所有当中最大的value就是整个数组的value,现在你有k次变换,每一次可以将其中的一个数变为任何一个使得数组价值最小的数. 假如题目的价值是所有的之和,也可以用这道题的方法. 思路: dp[i]表示的是到i这个位置,使得数组符合条件的最少变换次数. 这个符合条件就奇妙了,这个符合条件是由你定的,最终的符合条件就是答案. 简单来说:你举例一个答案,放进